• WCF进行大数据传输时的相关配置(转)


    最近一直在公司用WCF做server端,后来在做性能测试时,发现一个问题,当客户端从服务端取回一个实体对象列表时,触发了channel is faulted status的异常。

    仔细分析了下这个异常,应该是传递大数据造成的,因为在回传一个包含有100多个实体对象的列表时,客户端表现正常,而当回传的实体对象列表数目达到500+时,异常就出现了。

    其实WCF还是做得比较灵活的,基本所有的配置项都放在程序的app.config文件里面,改动相应参数时,不需要重新编译程序。而WCF设计的初衷,为了避免DOS一类的攻击,默认在生成配置文件时,对传输的buffer数值有一定的限制,默认是65535,也就是64KB。然而在一些特定的应用场景中,区区64KB的buffer是不能满足我们需要的。这就需要我们手动在配置文件中调整buffer的size。

    在配置文件中需要调整的一些参数,大致有下面几种:

    WCF binding中的maxBufferSize, maxReceivedMessageSize
    WCF binding ReaderQuotas中的maxArrayLength, maxBytesPerRead, maxDepth等

    在一些比较极端的场景中,我们可以把它设到最大2147483647,也就是约等于2GB大小的buffer。嗯,我想,除非你是用WCF来传输1080P的高清电影,否则2GB的大小能满足绝大多数情况的需求了。

    后来,我在更改相关参数大小后,发现异常依然存在,这个问题还郁闷了我很久,知道第二天,才在网上找到答案。原来,WCF的服务端和客户端,如果传递的是实体对象(Entitiy Model)一类的数据,在传输中会涉及到序列化的问题,WCF中还有个针对EndPoint的配置项,里面可以设定需要序列化的对象的最大size。后来我更改了dataContractSerializer maxItemsInObjectGraph属性后,这个问题,才得到了圆满的解决。修改配置文件,可以参考下面的例子:

    Client配置:

    1
    2
    3
    4
    5
    
    <endpointBehaviors> 
              <behavior name="ClientBehavior"> 
                <dataContractSerializer maxItemsInObjectGraph="10000000"/> 
              </behavior> 
            </endpointBehaviors>

    Server配置:

    1
    2
    3
    4
    5
    
    <serviceBehaviors> 
            <behavior name="HostBehavior"> 
              <dataContractSerializer maxItemsInObjectGraph="10000000"/> 
            </behavior> 
          <serviceBehaviors>

    修改后的客户端,支持和服务端传输1000+的实体对象列表,我想远远不止这个数量,上1w的对象估计都没问题。

    原文:http://www.xiaozhou.net/dotnetdevelopment/transfer_large_objects_between_server_and_client_using_wcf-2011-07-14.htm

  • 相关阅读:
    定点c程序之五:定点数的字长效应
    定点c程序之六(完):Q值的选取和动态Q值
    定点c程序之四:除法
    语音编解码器 3
    C#中强制转换、Convert转换 和Parse转换的差异(二)
    什么是AOP?我也来说说对AOP的理解
    SQL生成流水号
    sql得到中文首字母
    PowerDesigner从数据库生实体成到PD中,power designer逆向工程
    SQL解析IP地址的几种方式
  • 原文地址:https://www.cnblogs.com/shenfengok/p/2288322.html
Copyright © 2020-2023  润新知