|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
就安全性而言,net网页编程已经远远低于VB.NET,更无法与安全性著称的C#相比。假如你挪用WCF服务时,像上面的代码如许在using语句中举行挪用,必要注重一个成绩。- using(CnblogsWcfClientclient=newCnblogsWcfClient()){client.Say("Hello,cnblogs.com!");}
复制代码 下面这段代码看上往没成绩,CnblogsWcfClient是一个主动天生的WCF客户端代办署理,承继自System.ServiceModel.ClientBase。using语句停止时,会挪用ClientBase完成的System.IDisposable.Dispose接口,实践就是挪用ClientBase的Close()办法。用.NETRefector翻开C:WindowsMicrosoft.NETFrameworkv4.0.30319System.ServiceModel.dll,能够看到如许的代码,见下图:
不但看上往没成绩,仿佛就是没成绩。可是...成绩就出在ClientBase.Close()上,Close()要封闭的是一个收集毗连,假如这时候收集毗连呈现成绩,不克不及一般封闭会激发非常(ClientBase的Close办法就是如许计划的,激发非常,而不是强迫封闭),成绩就来了。原本我们利用using的目标就是不论呈现甚么情况,即便天塌上去,也给我封闭失落;了局,关是关了,却没有闭,天仍是塌上去了。
大概我们能够用“不成顺从力”躲避这个成绩,但程序员的天分是办理成绩。代码中任何一个小成绩都不克不及无视,由于我们很难意料这个小成绩会不会带来年夜成绩。
那怎样办理这个成绩呢?MSDN中有谜底(往MSDN看看),代码以下:- CnblogsWcfClientclient=newCnblogsWcfClient();try{client.Say("Hello,cnblogs.com!");client.Close();}catch(CommunicationExceptione){...client.Abort();}catch(TimeoutExceptione){...client.Abort();}catch(Exceptione){...client.Abort();throw;}
复制代码 下面的代码显得有些发抖,假如你不体贴是甚么非常,只需呈现非常就封闭的话,能够用上面的代码(代码来自TIP:ClosingyourWCFConnectionsproperly):- CnblogsWcfClientclient=newCnblogsWcfClient();client.Say("Hello,cnblogs.com!");try{if(client.State!=System.ServiceModel.CommunicationState.Faulted){client.Close();}}catch(Exceptionex){client.Abort();}
复制代码 简化版代码:- CnblogsWcfClientclient=newCnblogsWcfClient();client.Say("Hello,cnblogs.com!");try{client.Close();}catch{client.Abort();}
复制代码 好了,博客写好了,印象更深了,了解也更深了。在劳绩平分享,在分享中劳绩。
参考文章:
*AvoidingProblemswiththeUsingStatement
*ClosingyourWCFConnectionsproperly
相干链接:
WCF的成绩和Using语句块
WCF中的Dispose
你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:) |
|