注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

如何关闭WCF连接  

2014-11-27 17:16:16|  分类: WCF |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本文让你可以看到如何正确地关闭这些通信的连接。

如果你使用过Visual Studio为WCF服务生成WCF代理类,那么现在来看看里面生成的客户端类:

  1. public partial class StockServiceClient : System.ServiceModel.ClientBase<StockService.IStockService>, StockService.IStockService {
  2. ...
复制代码

客户端使用的主要代码继承自ClientBase<>,在MSDN看到它实现了IDisposable接口。与大多数实现IDisposable接口的类一样,为WCF客户端使用C#的using声明将是吸引人的。

  1. // 虽然很棒,但不能这样写:
  2. using(StockService.StockServiceClient client = new StockService.StockServiceClient(
  3.               "StockBasicHttpEndpoint", stockServiceUrl))
  4. {
  5. client.GetStockIdByName("MSFT");
  6. }
复制代码

如你所知,这样使用将在通信完成后自动调用client.Dispose()方法。这样就有一个问题,通过ClientBase类的Dispose()方法调用了Close()方法。当ClientBase类的Close()方法被调用后,Web服务实际上停止了WCF服务并通知它连接会话已不再需要保持。这似乎违反常理,但确实发生了。这个问题的解决办法是当Close()方法被调用后能抛出一个异常。毕竟,它涉及的是对Web服务的另一个网络调用。正因为如此,在WCF客户端是不推荐使用using声明的。

相反,你应该尝试在一个try-catch代码块执行Close()方法,在catch里执行Abort()方法。

  1. //正常调用Web服务.
  2. StockService.StockServiceClient client = new StockService.StockServiceClient(
  3.               "StockBasicHttpEndpoint", stockServiceUrl);
  4. string StockId = client.GetStockIdByName("MSFT");
  5. //服务完成后,使它关闭
  6. try
  7. {
  8.   if (client.State != System.ServiceModel.CommunicationState.Faulted)
  9.   {
  10.       client.Close();
  11.   }
  12. }
  13. catch (Exception ex)
  14. {
  15.   client.Abort();
  16. }
复制代码

如果你使用完全相同的关闭代码,那么上述解决方法也适用于ChannelFactory类。

  1. //从工厂创建通道channel实例
  2. ChannelFactory channel =
  3.   new ChannelFactory<IService1>("bindingName");
  4. IService1 client = channel.CreateChannel();
  5. client.DoWork();
  6. //服务完成后,使它关闭
  7. try
  8. {
  9.   if (client.State != System.ServiceModel.CommunicationState.Faulted)
  10.   {
  11.       client.Close();
  12.   }
  13. }
  14. catch (Exception ex)
  15. {
  16.   client.Abort();
  17. }
复制代码

就这些,非常简单。不要对WCF的client类使用'using';在try-catch块里调用Close()方法关闭客户端,异常发生后调用Abort()方法。

英文链接:Closing your WCF Connections properly

  评论这张
 
阅读(422)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017