不要在using语句中调用WCF服务
如果你调用WCF服务时,像下面的代码这样在using语句中进行调用,需要注意一个问题。
using (CnblogsWcfClient client = new CnblogsWcfClient()){ client.Say("Hello, cnblogs.com!");}
上面这段代码看上去没问题,CnblogsWcfClient是一个自动生成的WCF客户端代理,继承自System.ServiceModel.ClientBase。using语句结束时,会调用ClientBase实现的System.IDisposable.Dispose接口,实际就是调用ClientBase的Close()方法。用.NET Refector打开C:/Windows/Microsoft.NET/Framework/v4.0.30319/System.ServiceModel.dll,可以看到这样的代码,见下图:
不仅看上去没问题,似乎就是没问题。但是...问题就出在ClientBase.Close()上,Close()要关闭的是一个网络连接,如果这时网络连接出现问题,不能正常关闭会引发异常(ClientBase的Close方法就是这样设计的,引发异常,而不是强制关闭),问题就来了。本来我们使用using的目的就是不管出现什么状况,即使天塌下来,也给我关闭掉;结果,关是关了,却没有闭,天还是塌下来了。
也许我们可以用“不可抗拒力”回避这个问题,但程序员的天性是解决问题。代码中任何一个小问题都不能忽视,因为我们很难预料这个小问题会不会带来大问题。
那如何解决这个问题呢?MSDN中有答案(去MSDN看看),代码如下:
CnblogsWcfClient client = new CnblogsWcfClient();try{ client.Say("Hello, cnblogs.com!"); client.Close();}catch (CommunicationException e){ ... client.Abort();}catch (TimeoutException e){ ... client.Abort();}catch (Exception e){ ... client.Abort(); throw;}
上面的代码显得有些哆嗦,如果你不关心是什么异常,只要出现异常就关闭的话,可以用下面的代码(代码来自TIP: Closing your WCF Connections properly):
CnblogsWcfClient client = new CnblogsWcfClient();client.Say("Hello, cnblogs.com!");try{ if (client.State != System.ServiceModel.CommunicationState.Faulted) { client.Close(); }}catch (Exception ex){ client.Abort();}
简化版代码:
CnblogsWcfClient client = new CnblogsWcfClient();client.Say("Hello, cnblogs.com!");try{ client.Close();}catch{ client.Abort();}
好了,博客写好了,印象更深了,理解也更深了。在收获中分享,在分享中收获。
参考文章:
* Avoiding Problems with the Using Statement
* Closing your WCF Connections properly
作者:dudu
最近更新
随机推荐
- 网安隐患无处不在 黑客形成完整产业链
- 赶集网:城市新移民,值得互联网“弯
- Toll证实遭受勒索软件攻击 其在澳州各
- 360借条大力开发智能语音机器人,解决
- 滴滴打车停用电话会议系统 接入QQ高效
- 思科等四家公司网络设备产品被指存安
- phpMyAdmin 存在共享主机的远程信息泄
- 谷歌已经删除成千上万张名人iCloud艳
- 微点主动防御mp110013.sys驱动NtSyst
- 百胜集团旗下必胜客 肯德基网站中毒
- 传亚马逊9月推新8.9英寸Kindle平板 分
- Linux Kernel DRM IOCTL函数 未明权限
- 91为什么要卖给百度?
- KV网络版技术升级 离线管理全网漏洞
- 和码编程免费提供5000份爱心课程包,
- 比先前更危险:新的URI漏洞出现
- 百度称使用百度搜索若受骗可获无上限
- 斩断DDoS魔掌的六把利剑(二)
- 假冒Steam皮肤赠品网站窃取登录凭证
- 智联招聘上市 迎来新生or走到顶点