zoukankan      html  css  js  c++  java
  • 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了,算得上不小的数字了,如果数据量比这还要大的话,怕是网速已经不能满足要求了,这时需要考虑其他的解决方案。

  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/xuezhi/p/2850620.html
Copyright © 2011-2022 走看看