博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让WCF客户端的“调用”成为一种“享受”
阅读量:7222 次
发布时间:2019-06-29

本文共 2079 字,大约阅读时间需要 6 分钟。

推荐WCF客户端实现:

刚开始使用WCF时,总是在using中进行调用,比如:

using (CnblogsWcfClient client = new CnblogsWcfClient()) {
client.Say("Hello, cnblogs.com!"); }

后来发现,这是微软的一个“骗局”,当时我写了篇博客“”。

从此改为这样调用:

CnblogsWcfClient client = new CnblogsWcfClient(); client.Say("Hello, cnblogs.com!"); try {
client.Close(); } catch {
client.Abort(); }

每当写到这样的代码,心理总是有些不舒服。经过近10个月这样的不舒服之后,再也无法忍受。。。

于是,今天决定解决这个问题。。。

从 找到 ,发现了解决之道,但其中提供的代码不完整,经过几个小时的摸索,终于找到满意的解决方法。

让WCF客户端的调用成为“享受”的代码如下:

应用程序中调用代码:

调用代码一

//IUserService就是WCF的ServiceContract,是客户端自动生成的代理类 WcfClient.UseService((IUserService userService) => (userService.GetUser(userId)));

调用代码二:

WcfClient.UseService
(s => s.GetUser(userId));

WcfClient实现代码一(该代码只支持有返回值的WCF服务,推荐):

public class WcfClient {
public static TReturn UseService
(Func
func) {
var chanFactory = new ChannelFactory
("*"); TChannel channel = chanFactory.CreateChannel(); ((IClientChannel)channel).Open();  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客户端方法,但是我觉得至少比以前的方法用起来更舒服。解决问题之后,最好的庆祝方式就是写一篇博客。分享的不仅仅是解决方法,还有解决问题之后的那种兴奋!

补充

还有一种WcfClient实现方法(即支持有返回值的WCF服务,也支持无返回值的WCF服务),代码如下:

public static void UseService
(Action
action) {
var chanFactory = new ChannelFactory
("*"); TChannel channel = chanFactory.CreateChannel(); ((IClientChannel)channel).Open(); action(channel); try {
((IClientChannel)channel).Close(); } catch {
((IClientChannel)channel).Abort(); } }

WCF客户端调用示例代码:

WcfClient.UseService
(s => s.BeginCreate(feed, null, null));

转载地址:http://akzfm.baihongyu.com/

你可能感兴趣的文章
U-Mail邮件系统何以誉为信息整合中转枢纽
查看>>
强大的vim配置文件,让编程更随意
查看>>
崛起于Springboot2.X之配置文件详解(10)
查看>>
定时执行程序-Quartz简单实例
查看>>
【CF 应用开发大赛】MyfCMS系统
查看>>
windows下kangle虚拟主机-架设java空间的教程及心得
查看>>
Discuz! X2.5:文件目录结构
查看>>
我的友情链接
查看>>
TCP/IP协议及首部初了解
查看>>
防火墙iptables
查看>>
CUDA搭建
查看>>
memcached与PostgreSQL缓存命中机制
查看>>
百度地图路线检索(3)
查看>>
linux netstat 命令详解
查看>>
对前几篇blog的环境等的补充说明
查看>>
Curl命令使用解析大全
查看>>
MySQL日期函数
查看>>
【00】Effective Java
查看>>
.NET重构—单元测试重构
查看>>
SMB简介sabma服务(一)
查看>>