2011-04-13 53 views
1

我有一台运行在我的服务器上的NetTcp WCF服务,以及一个客户端异步调用该服务的某个方法。处理WCF调用时遇到的问题返回大量数据

当服务器返回少量数据时,一切都很顺利。但是,当有大量数据要返回时,客户会立即崩溃,甚至无法捕捉到异常情况。

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

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

+0

这可能是由于最大邮件大小,请参阅:http://stackoverflow.com/questions/884235/wcf-how-to-increase-message-size-quota/884248#884248 – Nate 2011-04-13 17:23:48

+0

多少钱是很多数据?你是否拥有客户,所以你可以对其进行调整? – driis 2011-04-13 17:24:08

+0

你可以获取块中的数据,还是将序列化程序更改为更节俭的? – 2011-04-13 17:29:43

回答

1

我的做法是:

  • 将数据分割成几个电话,(比如说)每500行基本的网页。少数几次往返(不是1次)不会影响延迟,但会增加稳定性,理想情况下,改变串行器(我偏向这里,但我喜欢protobuf-net)以减少每次调用所需的带宽结合启用MTOM

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

+0

@Marc Gravell再次获奖 - 谢谢! – 2011-04-14 11:12:51

1

试图通过添加下面的部分,以你的web.config增加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> 

您还可以启用跟踪为您服务。

<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> 

0

增加最大尺寸是不是最好的解决办法,如果你的服务是在某个时候会崩溃在IIS托管。如果您使用的是NetTCP bindig,则最好的方法是通过暴露TCP上的Stream,看看here。这里