• 大数据量传输时配置WCF的注意事项


    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 属性的值及其重要性有所不同,这取决于是否在接收消息的通道上对消息进行缓冲或流处理:

    可见,对于默认的缓冲传输,设置该属性是不必要的。

    2、ReaderQuotas:获取或设置可由配置了此绑定的终结点处理的 SOAP 消息的复杂性约束。

    该属性是XmlDictionaryReaderQuotasElement类型,一般需要设置该属性的MaxArrayLengthMaxStringContentLengthMaxDepth属性。

    示例代码:

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

  • 相关阅读:
    《社会动物》笔记
    对长城汽车品牌多样化的一点思考
    LightGBM简单例子
    mysql拆分字符串为多行(逗号等分割)
    vue中$refs、$emit、$on的使用场景
    js中的call()和apply()和bind()方法
    Vue.js中this.$nextTick()的使用
    Vue中ref和$refs的介绍及使用
    ES6(异步操作和Async函数&await)
    vue项目在git commit时,使用eslint检测
  • 原文地址:https://www.cnblogs.com/f204eng/p/2830136.html
Copyright © 2020-2023  润新知