【发布时间】:2015-02-11 09:48:08
【问题描述】:
我有一个 WCF 服务,它使用托管在一个简单的 Windows 窗体应用程序中的 Entity Framework 6。我的 WPF 客户端应用程序从添加到 ObservableCOllection 的服务中请求一个大视图(11000 条记录)。客户端计算机通过 WiFi 连接到我们的 VPN。
当我在 db 上运行 SQL Server Profiler 时,我可以看到查询本身非常快,但是 Audit Logout 持续时间很长,这表明连接保持打开很长时间,因为 WCF 将数据返回到通过 Http 的客户端:
在我的联网开发机器上,此事务非常快。如果我减少查询结果(例如 SELECT TOP 200...),则过程会大大加快,因此我知道这是导致问题的数据量。
这是我当前的绑定:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IIsesService" maxBufferSize="2147483647"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" useDefaultWebProxy="false" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://emea-diis01v:8082/" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IIsesService" contract="ServiceReference.IIsesService"
name="BasicHttpBinding_IIsesService" />
</client>
</system.serviceModel>
我已尝试实现 Mtom 消息传递,但这并没有明显的积极效果。我已经阅读了使用带有自定义绑定的 GZip 压缩。这是最好的做法吗?实现文档很薄。
如果做不到这一点,Net TCP 绑定是否可能被证明更有效?如果是这样,在 Winforms 应用程序而不是 IIS 中托管 WCF 服务时如何实现?
不幸的是,用户要求将整个视图返回到客户端 UI,我无法分页或异步结果。
【问题讨论】:
-
先想一想这个问题。你到底为什么要拉下 11000 条记录?咳咳……Facebook 是否一次性拉下 10 年的墙/饲料,嘿,使用 GZip 压缩。顺便说一句,您甚至不需要使用 customBinding 来使用 GZip。您可以改用 IIS 动态压缩以获得更好的性能。
-
这是一个文章编辑工具。用户需要在 dataGrid 中呈现给他们的所有数据。这不是 Facebook,要求完全不同……
-
您可能会尝试流式传输响应。看看这个:msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx
-
唯一的“解决方案”是以更小、更高效的批次下载数据,然后连接结果(即多次调用您的服务),但最终结果仍然会相当慢。这个要求简直荒谬:没有一个理智的人会坐下来一口气编辑 1100 个项目。此外:上传数据时也会出现同样的问题。
-
不,我明白你的意思是记录的数量。用户编辑来自世界各地的文章。文章按国家/地区定义。因此,我不能说 TOP 200,因为那时用户只会收到“阿富汗”文章。他们需要能够滚动到他们感兴趣的国家/地区,并且至少有一种错觉,即所有数据都在那里,即使它不是......