WCF傳輸數據量的能力受到許多因素的制約,如果程序中出現因需要傳輸的數據量較大而導致調用WCF服務失敗的問題,應注意以下配置:
1、MaxReceivedMessageSize:獲取或設置配置了此綁定的通道上可以接收的消息的最大大小。
basicHttpBinding等預定義的綁定一般具有MaxReceivedMessageSize屬性,CustomBinding則需要在Transport中定義。
示例代碼:
- <bindings>
- <customBinding>
- <binding name="customBinding">
- <binaryMessageEncoding>
- </binaryMessageEncoding>
- <httpTransport maxReceivedMessageSize="2147483647">
- </httpTransport>
- </binding>
- </customBinding>
- <basicHttpBinding>
- <binding name="basicBinding" maxReceivedMessageSize="2147483647"></binding>
- </basicHttpBinding>
- </bindings>
網上許多地方說應同時設置MaxBufferSize(獲取或設置緩沖區的最大大小,該緩沖區用於接收來自通道的消息。),根據MSDN上的解釋:
“MaxBufferSize 屬性的值及其重要性有所不同,這取決於是否在接收消息的通道上對消息進行緩沖或流處理:
* 對於緩沖傳輸,(TransferMode 設置為 Buffered)。該值始終等於由 MaxReceivedMessageSize 指定的值。
* 對於流傳輸(TransferMode 設置為 Streamed),必須對 SOAP 標頭進行緩沖才能生成消息。可根據需要對正文進行流處理。在此情況下,MaxBufferSize 小於或等於MaxReceivedMessageSize,其中 MaxReceivedMessageSize 限制整個消息(標頭和正文)的大小,而 MaxBufferSize 僅限制 SOAP 標頭的大小。”
可見,對於默認的緩沖傳輸,設置該屬性是不必要的。
2、ReaderQuotas:獲取或設置可由配置了此綁定的終結點處理的 SOAP 消息的復雜性約束。
該屬性是XmlDictionaryReaderQuotasElement類型,一般需要設置該屬性的MaxArrayLength、MaxStringContentLength及MaxDepth屬性。
示例代碼:
- <bindings>
- <customBinding>
- <binding name="customBinding">
- <binaryMessageEncoding>
- <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="64"/>
- </binaryMessageEncoding>
- <httpTransport maxReceivedMessageSize="2147483647">
- </httpTransport>
- </binding>
- </customBinding>
- <basicHttpBinding>
- <binding name="basicBinding" maxReceivedMessageSize="2147483647">
- <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="64"/>
- </binding>
- </basicHttpBinding>
- </bindings>
3、MaxItemsInObjectGraph:獲取對象圖中要序列化或反序列化的最大項數。
該屬性屬於DataContractSerializer類,需要在serviceBehaviors下的behavior節中配置。
示例代碼:
- <behaviors>
- <serviceBehaviors>
- <behavior name="Wcf4BigData.Web.BigDataServiceBehavior">
- <serviceMetadata httpGetEnabled="true"/>
- <serviceDebug includeExceptionDetailInFaults="false"/>
- <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
- </behavior>
- </serviceBehaviors>
- </behaviors>
以上是傳輸大數據量時可能需要設置的屬於WCF的幾個屬性,示例代碼中大多將屬性值設置為允許的最大值,但設置后並不能保證WCF一定具有傳輸如此大數據量的能力。另外,這些屬性一般需要在服務端和客戶端同時設置,但如果使用Silverlight客戶端,部分屬性如ReaderQuotas並不被支持。
4、MaxRequestLength:獲取或設置請求的最大大小。
如果WCF以IIS作為宿主,WCF傳輸數據量的能力還受到HttpRunttime設置的制約,可能需要同時HttpRunttime(在 system.Web節中)的MaxRequestLength屬性。MaxRequestLength屬性表示請求的最大大小(以千字節為單位)。默認大小為 4096 KB (4 MB),允許的最大值是2097151。
示例代碼:
- <httpRuntime maxRequestLength="2097151"/>
使用以上配置進行測試,從WCF端獲取1000萬條長度為10的字符串是成功的。每個長度為10的字符串編碼后約占32個字節,如此算來,成功傳輸的數據已經超過300M了,算得上不小的數字了,如果數據量比這還要大的話,怕是網速已經不能滿足要求了,這時需要考慮其他的解決方案。