您的位置:首页 > 大数据

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

2011-12-15 08:29 302 查看
最近一直在公司用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配置:

?[Copy to clipboard]View Code XML

1
2
3
4
5

<endpointBehaviors>
<behavior name="ClientBehavior">
<dataContractSerializer maxItemsInObjectGraph="10000000"/>
</behavior>
</endpointBehaviors>

Server配置:

?[Copy to clipboard]View Code XML

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: