|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。刚入手下手利用WCF时,老是在using中举行挪用,好比:- using(CnblogsWcfClientclient=newCnblogsWcfClient()){client.Say("Hello,cnblogs.com!");}
复制代码 厥后发明,这是微软的一个“圈套”,事先我写了篇博客“不要在using语句中挪用WCF服务”。
今后改成如许挪用:- CnblogsWcfClientclient=newCnblogsWcfClient();client.Say("Hello,cnblogs.com!");try{client.Close();}catch{client.Abort();}
复制代码 每当写到如许的代码,心思老是有些不恬逸。经由近10个月如许的不恬逸以后,再也没法忍耐。。。
因而,明天决意办理这个成绩。。。
从WhatisthebestworkaroundfortheWCFclient`using`blockissue?找到PracticalFunctionalC#-PartII,发明懂得决之道,但个中供应的代码不完全,经由几个小时的探索,终究找到中意的办理办法。
让WCF客户真个挪用成为“享用”的代码以下:
使用程序中挪用代码:- //IUserService就是WCF的ServiceContract,是客户端主动天生的代办署理类WcfClient.UseService((IUserServiceuserService)=>(userService.GetUser(userId)));
复制代码 WcfClient完成代码:- publicclassWcfClient{publicstaticTReturnUseService<TChannel,TReturn>(Func<TChannel,TReturn>func){varchanFactory=newChannelFactory<TChannel>("*");TChannelchannel=chanFactory.CreateChannel();TReturnresult=func(channel);try{((IClientChannel)channel).Close();}catch{((IClientChannel)channel).Abort();}returnresult;}}
复制代码 办理这个成绩的次要工夫花在找到下面代码中的谁人星号,星号对应的参数名是endpointConfigurationName。
入手下手时困扰于怎样给endpointConfigurationName参数传值。厥后,研讨了一下主动天生的代办署理类,也没有与endpointConfigurationName相干的信息,只是承继自System.ServiceModel.ClientBase<T>。然后,经由过程ILSPy反编译ClientBase<T>的代码,找到了这个星号,见下图:
小结
大概另有更“享用”的挪用WCF客户端办法,可是我以为最少比之前的办法用起来更恬逸。办理成绩以后,最好的庆贺体例就是写一篇博客。分享的不单单是办理办法,另有办理成绩以后的那种镇静!
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。 |
|