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

时间:2011-08-25 02:34:54

标签: c# .net wcf web-services

我听说即使在

时也必须处理(或关闭)WCF客户端代理
  • 您没有使用会话
  • 没有需要确定性清理的非托管资源(例如打开套接字)

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

var clt = new MyServiceClient();
clt.PlaceOrder(foo);
// no dispose

var clt = new ChannelFactory<IOrderService>().CreateChannel();
clt.PlaceOrder(foo);

由于

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:4)

创建ChannelFactory&amp;打开它是一项昂贵的操作,如果你关心性能,你应该避免每次通话都这样做。

即使使用basicHttpBinding,您的第一个用例也是不对的,因为它可能会为每个瞬时创建一个新的channelfactory。 .NET 3.5 SP1引入了一些ChannelFactory缓存,因此在某些情况下可能没问题。

在你的第二个用例中,如果你缓存并重用了channelfactory,那么处理并不是真正的nesseaary,但请记住你/你的部署人员可以改变绑定@部署时间,缺乏关闭/处置会产生巨大的影响。

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

答案 2 :(得分:2)

这实际上取决于客户的类型。例如,如果您编写一个调用该服务的ASP.NET应用程序,那么缓存代理是一个好主意,因为它的创建很昂贵。

这就是说,一旦你完成任何IDisposable资源,你应该处理它,以便被处置的对象有机会释放它所持有的资源,以便可以从内存中删除它。如果IDisposable对象具有Close方法,则应首先调用它。

关于这个引人入胜的主题的优秀文章可以在这里找到:http://msdn.microsoft.com/en-us/magazine/bb985010.aspx