刚开始使用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
dudu 2011-01-10 18:13 阅读:555 评论:0
dudu 2009-11-10 10:47 阅读:1416 评论:0
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
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)
好书收藏
经典文章
友情链接
最新评论
- 1. Re:一个伴随ASP.NET从1.0到4.0的OutputCache Bug
- 我们项目中,设置的VaryByParam="*",按F5刷新页面,在IE8下,status code是200,但是在Chrome和Firefox下显示304。可能这个还和浏览器有关。
- 2. Re:让WCF客户端的“调用”成为一种“享受”
- 比较实用。。。
- 3. Re:让WCF客户端的“调用”成为一种“享受”
- 做个记号。。。
- 4. Re:不要在using语句中调用WCF服务
- 看了本文和骗局,很有价值。不过,我个人的一个想法:MS之所以这样做的目的是:当有异常的时候,还是把异常交给用户自行来处理。否则,如果MS不所有的异常都CATCH了,那么我们的程序运行起来也就永远都不会有错了,但,业务正确了吗?当然,WCF的CLOSE似乎是可以强行关闭的,只是,假如,这个关闭导致的异常是因为我们的网络问题,甚或者是我们的程序导致的,而我们程序员却可以通过某些方面的检测或控制来避免,...
- 5. Re:博客园程序源代码下载
- 开源了,持续更新吗?
- 6. Re:寂寞如此美丽:脱离Application_Start,让初始化代码更优美
- @超级奶崽
反正在代码中没有引用关系的时候,直接放在一个目录就可以了。 - 7. Re:C# 正则表达式 —— 中文/英文空格(全角/半角空格)处理
- 站长也爱正则。。。支持一把。。。
(?=[\u4e00-\u9fa5]) 匹配表达式前面的位置
(?<=[\u4e00-\u9fa5]) 匹配表达式后面的位置
这样对于初看正则更通俗一些。。哈哈 - 8. Re:一个伴随ASP.NET从1.0到4.0的OutputCache Bug
- 对OutputCache这玩意儿深表不满,相当不好用。
- 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. 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)