2011-04-13 56 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。這裏