WCF大數據量傳輸配置


WCF傳輸數據量的能力受到許多因素的制約,如果程序中出現因需要傳輸的數據量較大而導致調用WCF服務失敗的問題,應注意以下配置

1、MaxReceivedMessageSize:獲取或設置配置了此綁定的通道上可以接收的消息的最大大小。

basicHttpBinding等預定義的綁定一般具有MaxReceivedMessageSize屬性,CustomBinding則需要在Transport中定義。

示例代碼:

  1. <bindings>
  2.   <customBinding>
  3.     <binding name="customBinding">
  4.       <binaryMessageEncoding>
  5.       </binaryMessageEncoding>
  6.       <httpTransport maxReceivedMessageSize="2147483647">
  7.       </httpTransport>
  8.     </binding>
  9.   </customBinding>
  10.   <basicHttpBinding>
  11.     <binding name="basicBinding" maxReceivedMessageSize="2147483647"></binding>
  12.   </basicHttpBinding>
  13. </bindings>

網上許多地方說應同時設置MaxBufferSize(獲取或設置緩沖區的最大大小,該緩沖區用於接收來自通道的消息。),根據MSDN上的解釋:

“MaxBufferSize 屬性的值及其重要性有所不同,這取決於是否在接收消息的通道上對消息進行緩沖或流處理:

    *      對於緩沖傳輸,(TransferMode 設置為 Buffered)。該值始終等於由 MaxReceivedMessageSize 指定的值。
    *      對於流傳輸(TransferMode 設置為 Streamed),必須對 SOAP 標頭進行緩沖才能生成消息。可根據需要對正文進行流處理。在此情況下,MaxBufferSize 小於或等於MaxReceivedMessageSize,其中 MaxReceivedMessageSize 限制整個消息(標頭和正文)的大小,而 MaxBufferSize 僅限制 SOAP 標頭的大小。”

可見,對於默認的緩沖傳輸,設置該屬性是不必要的。

2、ReaderQuotas:獲取或設置可由配置了此綁定的終結點處理的 SOAP 消息的復雜性約束。

該屬性是XmlDictionaryReaderQuotasElement類型,一般需要設置該屬性的MaxArrayLength、MaxStringContentLength及MaxDepth屬性。

示例代碼:

  1. <bindings>
  2.   <customBinding>
  3.     <binding name="customBinding">
  4.       <binaryMessageEncoding>
  5.         <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="64"/>
  6.       </binaryMessageEncoding>
  7.       <httpTransport maxReceivedMessageSize="2147483647">
  8.       </httpTransport>
  9.     </binding>
  10.   </customBinding>
  11.   <basicHttpBinding>
  12.     <binding name="basicBinding" maxReceivedMessageSize="2147483647">
  13.       <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="64"/>
  14.     </binding>
  15.   </basicHttpBinding>
  16. </bindings>

3、MaxItemsInObjectGraph:獲取對象圖中要序列化或反序列化的最大項數。

該屬性屬於DataContractSerializer類,需要在serviceBehaviors下的behavior節中配置。

示例代碼:

  1. <behaviors>
  2.   <serviceBehaviors>
  3.     <behavior name="Wcf4BigData.Web.BigDataServiceBehavior">
  4.       <serviceMetadata httpGetEnabled="true"/>
  5.       <serviceDebug includeExceptionDetailInFaults="false"/>
  6.       <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
  7.     </behavior>
  8.   </serviceBehaviors>
  9. </behaviors>

以上是傳輸大數據量時可能需要設置的屬於WCF的幾個屬性,示例代碼中大多將屬性值設置為允許的最大值,但設置后並不能保證WCF一定具有傳輸如此大數據量的能力。另外,這些屬性一般需要在服務端和客戶端同時設置,但如果使用Silverlight客戶端,部分屬性如ReaderQuotas並不被支持。

4、MaxRequestLength:獲取或設置請求的最大大小。

如果WCF以IIS作為宿主,WCF傳輸數據量的能力還受到HttpRunttime設置的制約,可能需要同時HttpRunttime(在 system.Web節中)的MaxRequestLength屬性。MaxRequestLength屬性表示請求的最大大小(以千字節為單位)。默認大小為 4096 KB (4 MB),允許的最大值是2097151。

示例代碼:

  1. <httpRuntime maxRequestLength="2097151"/>

使用以上配置進行測試,從WCF端獲取1000萬條長度為10的字符串是成功的。每個長度為10的字符串編碼后約占32個字節,如此算來,成功傳輸的數據已經超過300M了,算得上不小的數字了,如果數據量比這還要大的話,怕是網速已經不能滿足要求了,這時需要考慮其他的解決方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM