无法处理返回大量数据的WCF调用

时间:2011-04-13 17:20:13

标签: c# wcf

我的服务器上运行了一个NetTcp WCF服务,以及一个异步调用该服务方法之一的客户端。

当服务器返回少量数据时,一切都很糟糕。但是当有大量数据需要返回时,客户端会立即崩溃,甚至没有捕获的异常。

从我所看到的情况来看,崩溃几乎是在服务器返回数据后立即发生的。

任何想法如何调试这个?是否有一些关于服务的设置我应该调整以允许我在此调用中返回大量数据?

3 个答案:

答案 0 :(得分:1)

尝试增加maxReceivedMessageSize =“SomeMaxSize”

  <binding name="BasicHttp" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="true" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="1000000" maxBufferPoolSize="524288" maxReceivedMessageSize="1000000"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    </binding>

您还可以通过在web.config中添加以下部分来启用服务跟踪。

<system.diagnostics>
<sources>
  <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
    <listeners>
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\log\Traces.svclog" />
    </listeners>
  </source>
</sources>

答案 1 :(得分:1)

我的方法是:

  • 将数据拆分为多个调用,主要是(例如)每行500行。少数往返(而不是1)不会影响延迟,但会增加稳定性
  • 更改串行器(我在这里有偏见,但我喜欢protobuf-net)以减少每次通话所需的带宽,理想情况下与启用MTOM相结合

这应该以不同方式并行减少带宽,并解决问题。

答案 2 :(得分:0)

增加最大大小不是最佳解决方案,如果您的服务在某些时候托管在IIS中,它将崩溃。如果您使用NetTCP bindig,最好的方法是通过TCP公开Stream,查看here