【问题标题】:What is the recommended way to return a large collection from a WCF service?从 WCF 服务返回大型集合的推荐方法是什么?
【发布时间】:2016-05-26 10:35:06
【问题描述】:

在我的应用程序中,我想从 WCF 服务(作为 Windows 服务托管)返回一组对象,以在 WPF 应用程序中填充 DataGrid。集合中对象的数量从一个到几百不等,具体取决于调用的方法。

我很好奇处理从服务返回大量集合的“最佳”方式是什么。

以下是我看到的建议选项:

  • 增加最大消息大小并一次性返回所有对象。这似乎是个坏主意,因为有时我可能需要返回超过 2GB 的数据。
  • 对记录进行分页并重复调用该方法,直到检索到所有对象。我已经看到这个建议用于 ASP.NET 项目,但我不知道它对桌面应用程序的效果如何。
  • 使用流。老实说,我不明白这是如何工作的,因为它似乎是用于传输大型单个对象而不是许多较小的对象。
  • yield 关键字做某事,但这超出了我的想象,我无法理解它。 :-/

完成这项任务的最佳方法是什么,为什么?

【问题讨论】:

  • 用户极不可能在单个数据网格中使用 2 GB 的数据。有几个 UI 选项(例如搜索、分页、无限滚动)可用于处理向用户呈现大型数据集。我会尝试从 UI 的角度解决问题,通过找到一种更好的方式将数据呈现给用户。场景本身(后端的大数据集,前端的用户)很常见。

标签: c# wcf


【解决方案1】:

增加最大消息大小并返回所有对象 走。这似乎是个坏主意,因为可能会出现 当我需要返回超过 2GB 的数据时。

绝对不是一个好的选择,除非您确定您的数据永远不会超过您设置的新限制。否则,您只会将问题推回并在几个月后再次出现。顺便说一句,2Gb 已经很多了(想想你的用户会等多久)

对记录进行分页并重复调用该方法,直到所有 对象已被检索。我已经看到为 ASP.NET 建议的这个 项目,但我不知道它对桌面应用程序的效果如何。

最常见和最明显的方法是,您可以使用分页并仅在每个页面上查询定义数量的元素。我不明白你关于“桌面应用程序”的问题吗?这里的相关概念是客户端/服务器。 您的客户端(桌面应用程序)需要向服务器查询页面内容(如果您使用分页)以显示。如果您的客户是一个网页,那么这个概念仍然是相关的。

使用流。老实说,我不明白这是如何工作的 它似乎是为了传输大型单个对象而不是 比许多较小的。

我猜你读过诸如“管理你自己的信息流”之类的东西。简而言之,您可以将任何流视为位流,并在客户端按照您的意愿对其进行解释。我当然不建议这样做,除非您有非常具体的传输问题(并且有大量的对象要传输肯定不够具体)。有一些非常大的对象要传输可能已经足够具体了,但即使在这里我也会在这样做之前挑战实现。

使用 yield 关键字做一些事情,但这超出了我的想象 我跟不上它。 :-/

对不起,我在这里没有关注你,但 yield 只是语法糖,所以我认为它与解决你的问题无关。还是看看了解一下这个概念: What is the yield keyword used for in C#?

【讨论】:

  • 我将扩展第二点和第四点。关于桌面应用程序,您无法真正对 DataGrid 控件进行分页,所以我的理解是您只是反复调用该方法,直到没有新内容可返回。对于第 4 点,它谈到的一种方法似乎是使用 yield 关键字从服务中一次返回一个对象。我并没有真正阅读太多。
  • “你不能真正为 DataGrid 控件分页”?你总能找到一种方法来做到这一点,但我同意它不如网络视图那么原生。见stackoverflow.com/questions/784726/…
  • 我看不出一次返回一个对象对你来说是一个好的解决方案,所以我坚持你不需要 yield 来解决你的问题。
  • @Quarzy。我用我正在测试的当前方法一次拉 250 个(类似于你的链接)。需要做更多的试验,但到目前为止它看起来很有希望。抱歉,昨晚很忙,回答延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多