为什么配置/关闭WCF客户端代理很重要

Con*_*oob 9 .net c# wcf web-services

我听说即使在处理(或关闭)WCF客户端代理也是必不可少的

  • 你没有使用会话
  • 没有需要确定性清理的非托管资源(例如打开套接字)

例如,当使用带有默认绑定配置的BasicHttpBinding时,即使在流行的网页中也应该没问题,对吧?

var clt = new MyServiceClient();
clt.PlaceOrder(foo);
// no dispose
Run Code Online (Sandbox Code Playgroud)

要么

var clt = new ChannelFactory<IOrderService>().CreateChannel();
clt.PlaceOrder(foo);
Run Code Online (Sandbox Code Playgroud)

谢谢

Bra*_*tie 16

当你完成它们时,它是关闭事物(并处理掉它们)的好习惯.(即使你正在阅读/写入文件流,你会不会打开文件流?)副手,我可以看到一些原因:

  1. 服务器(可以/将)具有有限数量的活动连接.您处理服务越快,下一个客户端就越有可能使用该插槽.(如果事实上你为什么要等待超时?)
  2. 避免非活动连接的额外开销.现在授予的资源是"充足的",但是你保持的开销越少,最终你的表现就越好.
  3. 通过在客户端通过时处置客户端,可以降低由于超时导致的错误/异常的风险.
  4. 通过关闭它,你有效地保持服务器日志清洁.最后,即使客户端没有显示它,服务器最终也会出现超时异常,这些异常显示在日志中,因为休眠连接本来应该没有处理.
  5. MSDN说到(注意WCF客户端对象列表中的第4个子弹).

只有几个原因,我可以想到我的头脑.

  • @Kirk:同意,但也要检查以确保没有错误,否则应该执行Abort. (3认同)

小智 4

创建 ChannelFactory 并打开它是一项昂贵的操作,如果您关心性能,则应该避免为每个调用都执行此操作。

即使使用 basicHttpBinding,您的第一个用例也不正确,因为它可能会为每个实例创建一个新的通道工厂。.NET 3.5 SP1 引入了一些 ChannelFactory 缓存,因此在某些情况下可能没问题。

在您的第二个用例中,如果您缓存并重用通道工厂,则处置并不是真正必要的,但请记住您/您的部署人员可以更改部署时间的绑定,并且缺乏关闭/处置可能会产生巨大的影响。

总之,关闭/处置总是安全的,这就是 MSDN 建议的原因。