【问题标题】:Best practices for streaming response of WCF webserviceWCF webservice 流式响应的最佳实践
【发布时间】:2010-03-08 16:54:10
【问题描述】:

我正在尝试从 WCF Web 服务中提取大量数据。请求很小,响应消息会很大。目前,由于 IIS6 对其可以分配的内存(~1.4GB)的限制,Web 服务正在引发 SystemOutOfMemory 异常。

我在一些博客中读到实施流式传输将解决我的问题。

任何人都可以分享他们对这个主题的经验吗?我对可以共享的任何示例客户端和服务端代码或任何建议/最佳实践最感兴趣。内存流与文件流?返回类型应该是Stream、Message、Byte[]?

我的操作如下所示:(通常它会在响应数组中返回大量元素,~200K 元素)

MediumSizeResponseClass[] GetData(SmallSizeRequestClass request)

【问题讨论】:

    标签: wcf web-services streaming stream


    【解决方案1】:

    如果您只想流回响应,请在绑定配置中使用transferMode=streamedResponse。这确保只有返回的响应会被流式传输。

    流式处理函数的返回值必须是Stream。然后,您可以从该流中读取数据并对其执行任何您需要执行的操作(存储、分析等)。

    所以基本上你会有这样的服务合同:

    [ServiceContract]
    interface IYourService
    {
        [OperationContract]
        Stream GetData(SmallSizeRequestClass request);
    }
    

    在服务器上,您基本上只是写入流,而在客户端,您从流中读取。

    您是否查阅过 WCF Streaming 上的 MSDN 文档?

    【讨论】:

    • 另请参阅 msdn.microsoft.com/en-us/library/ms789010.aspx 以获取可以在上面链接到的页面底部找到的示例。
    • 谢谢马克,我有点熟悉实现流媒体的基础知识。我知道有不同的实现方式,一些开发人员会使用 Message 作为返回类型而不是 Stream 类。有些将使用 FileStream,而另一些则使用 MemoryStream。我正在尝试收集反馈,对 WCF 中流式传输的不同实现表示反对。
    • @Damian:好的,非常好。好吧,我自己在 WCF 中的流式处理方面没有太多的第一手经验,但我想说:使用任何有意义的流。它必须是一个流,一个流,一个流 - 但哪种类型在很大程度上无关紧要。如果服务器上已有文件 - 使用 FileStream。如果您需要从数据库表中加载 blob - 请使用 MemoryStream。我不知道使用一种类型的流与另一种类型的流有任何重大问题。但也许其他人可以启发我们更多!
    • MemoryStream 方法的问题不在于您最终会在返回流之前加载所有内容吗?如果您要返回大文件,您最终会遇到瓶颈,不是吗?
    • @spooner 是的,How to return stream from WCF service? 问题有相关答案。
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2010-11-03
    • 2015-02-07
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2013-03-01
    相关资源
    最近更新 更多