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配置:

<endpointbehaviors> 
          <behavior name="ClientBehavior"> 
            <datacontractserializer maxitemsinobjectgraph="10000000"></datacontractserializer> 
          </behavior> 
        </endpointbehaviors>

Server配置:

<servicebehaviors> 
        <behavior name="HostBehavior"> 
          <datacontractserializer maxitemsinobjectgraph="10000000"></datacontractserializer> 
        </behavior> 
      <servicebehaviors>

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

支持原创技术分享,据说打赏我的人,都找到了女朋友!