• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
路过的世界
释迦摩尼说过:众生皆有如来佛生相,求佛求人不如求己。
博客园    首页    新随笔    联系   管理    订阅  订阅

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

?[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

posted @ 2011-12-15 08:29  路过的世界  阅读(436)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3