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

本文关键字:代理 客户端 WCF 关闭 为什么 | 更新日期: 2023-09-27 18:06:31

我听说处置(或关闭)一个WCF客户端代理是必要的,即使

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

例如,当使用默认绑定配置的BasicHttpBinding,这应该是好的,即使在一个流行的网页,对吗?

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

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

谢谢

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

这是一个很好的实践,当你用完它们后关闭它们(并处理它们)。(你会让一个文件流打开,即使你已经读/写/从它吗?)马上,我可以看到一些原因:

  1. 服务器(可以/将)拥有有限数量的活动连接。处置服务越早,下一个客户机就能越早地使用该插槽。(如果您实际上已经通过,为什么要等待超时?)
  2. 避免非活动连接的额外开销。现在资源是"充足的",但是你保持的开销越少,你最终的性能就会越好。
  3. 当客户端通过时,通过处理客户端来减少由于超时而导致的错误/异常的风险。通过关闭它,你可以有效地保持服务器日志干净。最后,即使客户端没有显示超时异常,服务器也可以在日志中显示超时异常,这是由于休眠连接在应该被处理时没有被处理。
  4. MSDN说(注意WCF客户端对象列表中的第4个项目)。

这是我能想到的几个原因。

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

你的第一个用例是不正确的,即使使用basicHttpBinding,因为它可能会为每个实例创建一个新的channelfactory . . net 3.5 SP1引入了一些channelfactory缓存,所以你可能在某些情况下没问题。

在你的第二个用例中,如果你缓存和重用channelfactory,销毁并不是真正必要的,但请记住,你/你的部署人员可以更改绑定@部署时,缺乏关闭/销毁可能会产生巨大的影响。

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

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

也就是说,一旦你用完任何idisable资源,你应该释放它,这样被释放的对象就有机会释放它所持有的资源,这样它就可以从内存中被移除。如果一个IDisposable对象有Close方法,应该首先调用它。

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