2014-07-08 52 views
2

我有一個從客戶端發送一個大的XML到WCF net.tcp服務的問題,並且某些機器上的客戶端在調用方法時會引發內存不足異常,而我無法在我的本地機器上重現: 異常消息:無法分配33554432字節的託管內存緩衝區。可用內存量可能很低。WCF NetTcp服務和流式傳輸模式

因此,通過閱讀方式來解決這個問題,它接縫流是一種方式。 所以我改變了客戶端都與服務相應的綁定:

<netTcpBinding> 
     <binding name="NetTcpBinding_IPricerDataService" closeTimeout="00:10:00" transferMode="Streamed" 
      openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" /> 
</netTcpBinding> 

不過,我的印象是,這意味着還改變服務方法簽名使用的是流參數下: http://msdn.microsoft.com/en-us/library/ms789010(v=vs.110).aspx

我沒有做到這一點,我已經離開了方法簽名,因爲他們原來是這樣,但我的客戶仍然可以按照以前的方式調用服務方法,並且所有這些都按預期工作。

這是否意味着流式轉換代碼沒有按預期方式使用,還是我不需要更改方法簽名以支持流式傳輸? 任何想法我怎麼能真正檢查?

回答

2

如果您不更改您的方法簽名,那麼您不是嚴格按照以前的方式發送數據,而是發送它,而不管服務器配置如何。作爲MSDN文檔您鏈接狀態:

  • 保存數據的參數來進行流必須在方法的唯一參數。例如,如果輸入消息是要傳輸的消息,則該操作必須只有一個輸入參數。同樣,如果輸出消息要流式傳輸,則該操作必須具有一個輸出參數或返回值
  • 至少類型參數返回值中的一個必須是,消息,或IXmlSerializable的。

這意味着,爲您上游方法,你指定一個Stream爲參數,其表示數據要發送了該流,併爲您的下游方法指定Stream作爲返回類型,它將包含要讀取的數據。

這表現在以下ServiceContract

[OperationContract] 
Stream GetStream(string data); 
[OperationContract] 
bool UploadStream(Stream stream); 
[OperationContract] 

如果如上所示不指定你的方法,你就不會結束,客戶端和服務之間的流數據 - 你將使用與您在更改服務器配置之前完全相同的方法。這也是爲什麼你的方法仍然有效的原因,即使你指定了你想在配置中使用流媒體,但沒有改變你的方法。

更改這些方法以符合MSDN文章中規定的標準,並且您應該正確地傳輸數據。只要確保你考慮了整個上/下游的事情,因爲它會顛倒的客戶端和服務器。

在一個側面說明,你的異常消息:

異常消息:無法分配的33554432個字節的管理存儲器緩衝器。可用內存量可能很低。

指示系統無法爲包含數據的底層緩衝區分配32MB的數據。即使您正確實施流式傳輸,此問題仍可能繼續存在。在正常情況下,32MB緩衝區應該不成問題。

+0

@DanielKelley它不能回答這個問題嗎? '這是否意味着流式轉換代碼沒有按預期使用,或者我不需要更改方法簽名以支持流式傳輸?「,以及一些關於未分配緩衝區的說法。 – aevitas

+0

@DanielKelley謝謝,我會編輯答案,簡單地陳述「是的,你應該。」因爲這似乎是你的追求。如果你覺得它沒有回答這個問題,請隨時downvote。 – aevitas

+0

@DanielKelley謝謝,我詳細闡述了我的答案。 – aevitas