流式处理 WCF 大量对象
Posted
技术标签:
【中文标题】流式处理 WCF 大量对象【英文标题】:Streaming WCF large number of objects 【发布时间】:2012-11-09 19:04:02 【问题描述】:我面临着编写一个在 IIS 上运行的 WCF 服务器,以供不同计算机上的其他平台使用。我需要将大量对象(序列化)返回给客户端。我需要它进行流式传输,因为从我的数据库中获取所有数据并根据客户的要求对其进行安排是一个非常漫长的过程,因此我需要客户端能够在结果流出时对其进行处理。
在对该主题进行了一些阅读之后,似乎如果我将 WCF 与 transferMode StreamedResponse 一起使用,我可以返回延迟执行的对象,这可能会满足我的需求。
我阅读了以下文章: http://weblogs.asp.net/cibrax/archive/2008/06/10/streaming-large-content-with-wcf-and-deferred-execution.aspx
并实现了与他们描述的 WCF 类似的 WCF。但是我将他们的代码更改为:
for(long i = 0; i < 1000; i++) //All the customers should be read from the database
yield return new Customer FirstName = "Foo", LastName = "Bar", Address = "FooBar 123" ;
到:
for(long i = 0; i < 1000000; i++) //All the customers should be read from the database
yield return new Customer FirstName = "Foo", LastName = "Bar", Address = "FooBar 123" ;
所以它会模拟大量数据。 我注意到,当我这样做时,客户端的功能会在返回对象之前停止几秒钟。 为什么会这样? 数据不应该立即开始在流上流动吗? 这不是延迟执行的流式 WCF 的重点吗? 您对我的问题有更好的建议吗?
【问题讨论】:
阅读完这篇文章后,我最好的猜测是您实际上是在立即流式传输数据,但客户端仍然需要收到所有数据,然后才能开始解析/处理。这样做的主要目的似乎是让服务器不必将完整的响应存储在 RAM 中,然后再一次将其全部发送出去。第 4 步(粗略地)说“客户端一次从响应消息中读取一个客户”,但看起来响应消息已经完全收到,客户端只是一次反序列化一个客户。 您的客户端代码是什么?在你做任何事情之前,你是不是在等待所有的物体都碰到?如果您在调试器中,并且考虑到您拥有的代码,您可能会在尝试单步执行某些操作时强制枚举(获取所有数据)。某些安全设置也可能会减慢 WCF 连接速度... 所以您认为客户正在等待所有客户的到来?有没有办法防止这种情况?在我的客户端,我使用了函数 static IEnumerable我查看了链接中的代码。
看起来 CreateMessage 在服务器上运行,将整个结果放在变量消息中,然后服务器开始返回任何数据。
Message message = Message.CreateMessage(MessageVersion.Soap11, "GetAllCustomers", new CustomBodyWriter(GetAllCustomersImpl()));
return message;
【讨论】:
接口为:[ServiceContract] public interface IService1 [OperationContract] Message GetAllCustomers(); 。这是否意味着客户端等待所有数据?如果是这样,流式传输的意义何在? 不是客户端等待,而是服务器在生成整个列表之前没有开始发送。等待是在流媒体开始之前。 我再次测试了这个,在“返回消息”上设置了一个断点;行和客户端的断点,我注意到时间不是在服务器端构建消息,而是在消息的实际返回中。意味着它在发送数据的 wcf 实现中。以上是关于流式处理 WCF 大量对象的主要内容,如果未能解决你的问题,请参考以下文章