首页 文章

WCF中的异步流

提问于
浏览
7

我正在使用WCF进行流式处理,我对“Enabling Asynchronous Streaming”中的段落在WCF中关于大数据和流式传输的MSDN文章中的含义有疑问 .

要启用异步流,请将DispatcherSynchronizationBehavior endpoints 行为添加到服务主机,并将其AsynchronousSendEnabled属性设置为true . 我们还在发送端添加了真正异步流的功能 . 这提高了服务的可扩展性,在这种情况下,它将消息流式传输到多个客户端,其中一些客户端可能由于网络拥塞或根本不读取而导致读取速度缓慢 . 在这些场景中,我们现在不会阻止每个客户端的服务上的单个线程 . 这确保了服务能够处理更多客户端,从而提高了服务的可扩展性 .

我明白上面的意思是我补充说

<behaviors>
  <endpointBehaviors>
    <behavior name="AsyncStreaming">
      <dispatcherSynchronization asynchronousSendEnabled="true" />
    </behavior>
  </endpointBehaviors>
  ...

到我的 web.config 文件并引用我的 endpoints 中的 AsyncStreaming 行为,但我不明白这些步骤为我做了什么 . 我是否需要修改我的代码才能利用这种异步性?

同样在一个类似的主题上(但是如果它太不同了我会把它转移到一个新问题),在WCF中使用Streams使用async / await效果怎么样?我可以在服务 Contract 中做 Task<Stream> Foo() 吗?我做了一些数据库调用,其结果我最终将包装到我将从WCF服务返回的自定义流中 . 能够使用 ExecuteDataReaderAsync() 这样的东西非常有用,在处理流式传输而不是缓冲消息时,我仍然可以使用它吗?

我已经测试了它,我知道"works"使用任务但我不知道是否这样做会导致函数回退到"Buffered"模式,就像你为函数提供了多个参数一样(参见“Programming Model for Streamed Transfers”的第3段)相同的MSDN页面),我不知道如何检查是否发生了这种情况 .

2 回答

  • 2

    我通过.NET Reference Source追溯到RequestContext . 显然,ChannelHandler.sendAsynchronously字段控制是否异步(通过 RequestContext.BeginReply/EndReply APM方法)或通过 RequestContext.Reply 同步完成消息回复 .

    据我所知,所有这一切都释放了一个服务器端线程,该线程返回到池中,否则将在 RequestContext.Reply 内忙于"pumping"流到客户端,只要 Stream 对象处于活动状态服务器 .

    这似乎是完全透明的,所以我认为你可以安全地使用 async 基于TAP的 Contract 方法并返回 Task<Stream> . 在另一种 Contract 方法中,你可以做 await Stream.WriteAsync ,例如 .

    当你到达那里时,请分享你的实际经验作为你自己的答案,我对细节非常感兴趣:)

  • 2

    关于复杂主题的好问题 . 我已经实现了一个流式WCF服务来容纳大量(最多2GB)的下载,但是我对这个AsyncStreaming = True业务有点困惑,因为WCF已经异步(因为每个连接的客户端都有自己的线程和请求和异步接收)只要

    <ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, InstanceContextMode:=InstanceContextMode.PerCall)>
    

    但您必须更改代码才能使流式传输工作 . 即使您有 Binding.TransferMode = TransferMode.Streamed ,如果您不更改代码,程序将恢复为缓冲,以便您上传和下载功能A)获取并返回流,B)您的上传和下载功能实现如下:

    //oBuffer is your content
    if (oBuffer != null) {
        oStream = new MemoryStream(oBuffer);
    
        if (oStream.CanSeek) {
            oStream.Seek(0, SeekOrigin.Begin);
        }
        return oStream;
    }
    

    这是我用作指南的一篇体面的HowTo文章:http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP

相关问题