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

  • 相关阅读:
    自定义View的ToolBar布局报错Error:(2) No resource identifier found for attribute 'context' in package 'c
    在学git之主分支 branch
    获取发布版SHA1
    关于开启线程与UI的操作
    播放音频和视频(VideoView控件)
    通知栏Notification的应用
    Android 真机调式 Installation failed with message 远程主机强迫关闭了一个现有的连接。. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing. WA
    运行程序申请危险权限
    mysql乐观锁总结和实践
    Nginx配置文件nginx.conf中文详解
  • 原文地址:https://www.cnblogs.com/f204eng/p/2830136.html
Copyright © 2011-2022 走看看