让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客户端方法,但是我觉得至少比以前的方法用起来更舒服。解决问题之后,最好的庆祝方式就是写一篇博客。分享的不仅仅是解决方法,还有解决问题之后的那种兴奋!
当前标签: WCF
让WCF客户端的“调用”成为一种“享受”
WCF Web API 轻松实现 REST
WCF异步调用实战:OneWay+Asynchronous Operation
抛弃WebService,在.NET4中用 jQuery 调用 WCF
在.NET 4中用IIS部署WCF就这么简单
不要在using语句中调用WCF服务
枚举类型引起WCF的错误——“This could be due to the service endpoint binding not using the HTTP protocol”
当WCF遭遇An existing connection was forcibly closed by the remote host
jQuery调用WCF需要注意的一些问题
公告
人生的真正价值在于从何种程度与何种意义上摆脱自我!
博问,帮您解决IT难题
昵称: dudu
园龄: 7年9个月
粉丝: 1337
关注: 210
已关注 -取消
< 2011年11月 > 日 一 二 三 四 五 六 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10
搜索
常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签
最新随笔 1. 一个伴随ASP.NET从1.0到4.0的OutputCache Bug 2. 寂寞如此美丽:脱离Application_Start,让初始化代码更优美 3. 让WCF客户端的“调用”成为一种“享受” 4. WCF Web API 轻松实现 REST 5. WCF异步调用实战:OneWay+Asynchronous Operation 6. 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet 7. 实战 SQL Server 2008 数据库误删除数据的恢复 8. 用 ASP.NET MVC 实现基于 Multipart XMLHttpRequest 的 Comet 9. 关于在Application_Start中访问Context.Request 10. 遭遇ASP.NET的Request is not available in this context
我的标签 Entity Framework (24) ASP.NET (12) ASP.NET MVC (9) WCF (9) VS2010 (8) Entity Framework 实践系列 (6) 新功能发布 (4) Memcached (4) 创业 (3) IIS 7 (3) 更多
随笔分类 ASP.NET(28) (rss) C#(14) (rss) SharePoint(17) (rss) VS2005(8) (rss) WCF(5) (rss) 博客系统开发(1) (rss) 创业(14) (rss) 电脑使用经验(19) (rss) 读书(3) (rss) 好歌收藏(9) (rss) 开源(5) (rss) 媒体报道(4) (rss) 生活随笔(4) (rss) 数据库技术(5) (rss) 推荐阅读(18) (rss) 网站功能发布(71) (rss) 网站管理(165) (rss) 网站性能优化(4) (rss) 新闻推荐(2) (rss) 宅急送快递门事件(12) (rss)
随笔档案 2011年11月 (3) 2011年10月 (9) 2011年9月 (4) 2011年8月 (5) 2011年7月 (10) 2011年6月 (2) 2011年5月 (4) 2011年4月 (10) 2011年3月 (13) 2011年2月 (12) 2011年1月 (12) 2010年12月 (2) 2010年11月 (3) 2010年10月 (3) 2010年9月 (2) 2010年8月 (15) 2010年7月 (4) 2010年6月 (6) 2010年5月 (11) 2010年3月 (1) 2010年2月 (4) 2010年1月 (5) 2009年12月 (4) 2009年11月 (17) 2009年10月 (6) 2009年7月 (4) 2009年6月 (3) 2009年5月 (4) 2009年4月 (5) 2009年3月 (1) 2009年2月 (1) 2009年1月 (4) 2008年12月 (4) 2008年11月 (5) 2008年10月 (5) 2008年9月 (3) 2008年7月 (4) 2008年6月 (7) 2008年5月 (28) 2008年4月 (15) 2008年3月 (15) 2008年2月 (7) 2008年1月 (9) 2007年12月 (11) 2007年11月 (12) 2007年10月 (13) 2007年9月 (7) 2007年8月 (14) 2007年7月 (16) 2007年6月 (13) 2007年5月 (11) 2007年4月 (6) 2007年3月 (14) 2007年2月 (12) 2007年1月 (15) 2006年12月 (18) 2006年11月 (26) 2006年10月 (20) 2006年9月 (18) 2006年8月 (23) 2006年7月 (17) 2006年6月 (8) 2006年5月 (23) 2006年4月 (10) 2006年3月 (16) 2006年2月 (17) 2006年1月 (9) 2005年12月 (13) 2005年11月 (9) 2005年10月 (19) 2005年9月 (11) 2005年8月 (24) 2005年7月 (34) 2005年6月 (23) 2005年5月 (11) 2005年4月 (21) 2005年3月 (32) 2005年2月 (19) 2005年1月 (23) 2004年12月 (35) 2004年11月 (24) 2004年10月 (19) 2004年9月 (25) 2004年8月 (35) 2004年7月 (30) 2004年6月 (24) 2004年5月 (17) 2004年4月 (9) 2004年3月 (57) 2004年2月 (61) 2004年1月 (31)
相册 Imagination Festival 2007 TechED 2005 TechEd 2006 TechEd2007 广州沙龙活动 桌面
好书收藏 《.NET软件架构之美(英文影印版)》
经典文章 浪潮之巅
友情链接 真水无香
最新评论
1. Re:一个伴随ASP.NET从1.0到4.0的OutputCache Bug
我们项目中,设置的VaryByParam="*",按F5刷新页面,在IE8下,status code是200,但是在Chrome和Firefox下显示304。可能这个还和浏览器有关。
--快乐八哥
2. Re:让WCF客户端的“调用”成为一种“享受”
比较实用。。。
--xiao ming
3. Re:让WCF客户端的“调用”成为一种“享受”
做个记号。。。
--SNAIL_ll
4. Re:不要在using语句中调用WCF服务
看了本文和骗局,很有价值。不过,我个人的一个想法:MS之所以这样做的目的是:当有异常的时候,还是把异常交给用户自行来处理。否则,如果MS不所有的异常都CATCH了,那么我们的程序运行起来也就永远都不会有错了,但,业务正确了吗?当然,WCF的CLOSE似乎是可以强行关闭的,只是,假如,这个关闭导致的异常是因为我们的网络问题,甚或者是我们的程序导致的,而我们程序员却可以通过某些方面的检测或控制来避免,...
--笨笨蜗牛
5. Re:博客园程序源代码下载
开源了,持续更新吗?
--Virus-BeautyCode
6. Re:寂寞如此美丽:脱离Application_Start,让初始化代码更优美
@ 超级奶崽
反正在代码中没有引用关系的时候,直接放在一个目录就可以了。
--Virus-BeautyCode
7. Re:C# 正则表达式 —— 中文/英文空格(全角/半角空格)处理
站长也爱正则。。。支持一把。。。
(?=[\u4e00-\u9fa5]) 匹配表达式前面的位置
(?<=[\u4e00-\u9fa5]) 匹配表达式后面的位置
这样对于初看正则更通俗一些。。哈哈
--porschev
8. Re:一个伴随ASP.NET从1.0到4.0的OutputCache Bug
对OutputCache这玩意儿深表不满,相当不好用。
--Ivony...
9. Re:寂寞如此美丽:脱离Application_Start,让初始化代码更优美
没必要吧
--户籍民警
10. Re:一个伴随ASP.NET从1.0到4.0的OutputCache Bug
要深入了解一个产品,才能避免问题,或者说找到改正问题。
--户籍民警
阅读排行榜
1. 电脑故障处理小经验—IE无法打开链接的处理方法(290319) 2. 电脑故障处理经验一则(276344) 3. 10 Golden rules for publishing your blog (84536) 4. 博客园程序源代码下载(73893) 5. Windows 2000 常见进程功能描述[转帖](67278) 6. 在Windows下配置与使用CVSNT(63398) 7. 新增的MSN图片(56483) 8. 博客园FAQ(52167) 9. 网速测试(46839) 10. 日志文件分析工具—AWStats在IIS中的配置步骤(30250) 11. 不错的工具:Reflector for .NET (29612) 12. 安装智能陈桥五笔时请小心(28403) 13. 清除SearchNet.exe(27090) 14. 如何实现文本框焦点自动跳转及通过回车键提交表单(26114) 15. 基于.NET的CMS软件的选择(24391)
评论排行榜
1. 电脑故障处理经验一则(1137) 2. [重要新功能]团队Blog(619) 3. 博客园FAQ(608) 4. [公告]博客园准备建立SharePoint团队(421) 5. 10 Golden rules for publishing your blog (381) 6. 电脑故障处理小经验—IE无法打开链接的处理方法(358) 7. 博客园程序源代码下载(302) 8. 上海语程信息科技有限公司(262) 9. 网速测试(240) 10. 博客园开发团队征婚启示(183)
推荐排行榜
1. ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies(38) 2. ASP.NET中获取URL重写前的原始地址(22) 3. jQuery调用WCF需要注意的一些问题(22) 4. 不要在using语句中调用WCF服务(21) 5. 想爱容易,相处难:当ASP.NET MVC爱上IoC(20) 6. 通过SQL Server 2008数据库复制实现数据库同步备份(19) 7. 不错的VS2010扩展——JSEnhancements,让js和css也折叠(19) 8. Web应用架构探索笔记 —— 查询(18) 9. 满园尽是503,记曾经的一次IIS 7性能考验(17) 10. 实战 SQL Server 2008 数据库误删除数据的恢复(17) 11. ISAPI_Rewrite引起的IIS应用程序池崩溃(fatal communication error)(16) 12. 寂寞如此美丽:脱离Application_Start,让初始化代码更优美(15) 13. 在Entity Framework 4中映射现有实体类(POCO)(15) 14. 博客园已经用上NorthScale Memcached Server(14) 15. 介绍一款Memcached服务器软件:NorthScale Memcached Server(13)
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于让WCF客户端的“调用”成为一种“享受”的详细内容...