如何在WCF中实现流式传输?

发布于 2024-11-28 10:46:45 字数 117 浏览 0 评论 0原文

我在使用 WCF 获取大量数据时遇到问题,因此我不想增加“maxReceivedMessageSize =“65536”。因此有任何替代方案或者我可以使用流式传输来实现这一点。如果是,那么如何?

请建议。

I am facing the problem while using the WCF to fetching the large amount of data, so I do not want to increase the "maxReceivedMessageSize="65536". So any alternative for that or can I achieve that using streaming. If yes then how ?

Please suggest.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苏佲洛 2024-12-05 10:46:45

是的,您可以在 WCF 中流式传输数据,但 WCF 在流式传输模式下工作时有一些限制。因此,如果您不介意自己处理它,您可能会考虑实现一个返回数据块的方法并多次调用它。

否则,您可以在配置中启用流模式,例如

<basicHttpBinding>
  <binding name="HttpStreaming" maxReceivedMessageSize="67108864"
           transferMode="Streamed"/>
</basicHttpBinding>
<!-- an example customBinding using Http and streaming-->
<customBinding>
  <binding name="Soap12">
    <textMessageEncoding messageVersion="Soap12WSAddressing10" />
    <httpTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/>
  </binding>
</customBinding>

并从您的 Contract 方法返回一个 Stream 对象。这样,当您读取流对象时,数据就会被传输。

interface IRemoteFileService
{
     Stream OpenFile(string serverPath);
}

如果您的数据位于流中,例如传输文件时。你只需打开流并返回它。否则,您可以使用 MemoryStreamDataContractSerializer序列化几乎所有对象树

有关详细信息,请查看

虽然这听起来很简单,但存在复杂性和局限性对于流模式。如果您只需要一种简单的方法来绕过大对象传输的大小限制,请考虑在多次调用中部分发送对象。

Yes you can stream data in WCF, but WCF has some limitations while working in Streamed mode. So you might like to consider implementing a method that returns chunks of data and calling it multiple times if you don't mind handling it yourself.

Otherwise you can enable Streamed mode in configuration like

<basicHttpBinding>
  <binding name="HttpStreaming" maxReceivedMessageSize="67108864"
           transferMode="Streamed"/>
</basicHttpBinding>
<!-- an example customBinding using Http and streaming-->
<customBinding>
  <binding name="Soap12">
    <textMessageEncoding messageVersion="Soap12WSAddressing10" />
    <httpTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/>
  </binding>
</customBinding>

And return a Stream object from your Contract method. This way the data will be transferred as you read the stream object.

interface IRemoteFileService
{
     Stream OpenFile(string serverPath);
}

if your data is in a stream like a when you transfer a file. you just open the stream and return it. otherwise you can use a MemoryStream and DataContractSerializer to serialize almost any object tree.

for details check this and this

While this sounds simple there are complications and limitations for Streamed mode. If you just need a simple way to bypass the size limits for a big object transfer, Consider sending the object partially on multiple calls.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文