让WCF客户端的“调用”成为一种“享受”
刚开始使用WCF时,总是在using中进行调用,比如:
using (CnblogsWcfClient client = new CnblogsWcfClient()) { client.Say("Hello, cnblogs.com!"); }后来发现,这是微软的一个“易做图”,当时我写了篇博客“不要在using语句中调用WCF服务”。
从此改为这样调用:
CnblogsWcfClient client = new CnblogsWcfClient(); client.Say("Hello, cnblogs.com!"); try { client.Close(); } catch { client.Abort(); }每当写到这样的代码,心理总是有些不舒服。经过近10个月这样的不舒服之后,再也无法忍受。。。
于是,今天决定解决这个问题。。。
从 What is the best workaround for the WCF client `using` block issue? 找到 Practical Functional C# - Part II,发现了解决之道,但其中提供的代码不完整,经过几个小时的摸索,终于找到满意的解决方法。
让WCF客户端的调用成为“享受”的代码如下:
应用程序中调用代码:
//IUserService就是WCF的ServiceContract,是客户端自动生成的代理类 WcfClient.UseService((IUserService userService) => (userService.GetUser(userId)));WcfClient实现代码:
public class WcfClient { public static TReturn UseService<TChannel, TReturn>(Func<TChannel, TReturn> func) { var chanFactory = new ChannelFactory<TChannel>("*"); TChannel channel = chanFactory.CreateChannel(); TReturn result = func(channel); try { ((IClientChannel)channel).Close(); } catch { ((IClientChannel)channel).Abort(); } return result; } }解决这个问题的主要时间花在找到上面代码中的那个星号,星号对应的参数名是endpointConfigurationName。
开始时困扰于如何给endpointConfigurationName参数传值。后来,研究了一下自动生成的代理类,也没有与endpointConfigurationName相关的信息,只是继承自System.ServiceModel.ClientBase<T>。然后,通过ILSPy反编译ClientBase<T>的代码,找到了这个星号,见下图:
小结
也许还有更“享受”的调用WCF客户端方法,但是我觉得至少比以前的方法用起来更舒服。解决问题之后,最好的庆祝方式就是写一篇博客。分享的不仅仅是解决方法,还有解决问题之后的那种兴奋!
作者 dudu
补充:Web开发 , ASP.Net ,
- 更多asp疑问解答:
- asp正则过滤重复字符串的代码
- 用asp过滤全部html但保留br类似的符号
- 会asp,但感觉asp要过点,想学php。但我一般做的都是小公司的站,用access数
- PHP的空间可以用ASP的源代码吗?
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 想做一个市级的人才网acess,sql数据库,语言asp,jsp,php分别用哪种好
- jsp,asp,php 区别
- 我想找一个有比较多漏洞的网站的源码,比如可以asp,php注入等都可以。供学习研究用。请提供下载地址。。
- 现在候找人做个网站,用ASP,还是PHP语言去做好
- asp,php ,jsp,.net 对于做网站前台的重要吗?
- asp和php的区别是什么?
- 我是新手SEO菜鸟 请问wp dw php asp cms myspl dede 这些软件应该如何区分呀?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?