最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面:

  ①WCF的地址会变动,地址虽变,但是里面的逻辑不变!

  ②不要引用WCF服务的接口DLL文件,这样会导致一定的耦合性(虽然接口一旦指定就不会改动了)!

 1.手动配置服务(这种方式比较傻瓜)

    这种方式比较容易,也不多说了,直接给个地址就好了:学习 WCF (6)--学习调用WCF服务的各种方法     

 2.引用接口DLL,通过地址动态调用WCF服务

 1         private void ReleasePC(string clientName, string ttgServiceURL)
2 {
3 try
4 {
5 object[] obj = new object[2] { clientName, clientName };
6 string str = (string)ExecuteMethod<IGatewayWebService>(ttgServiceURL, "ReleasePC", obj);
7 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None) { MaxReceivedMessageSize = 6666 };
8 EndpointAddress address = new EndpointAddress(ttgServiceURL);
9 ChannelFactory<IGatewayWebService> ttgService = new ChannelFactory<IGatewayWebService>(binding, address);
10 string result = ttgService.CreateChannel().ReleasePC(clientName, clientName);
11 GatewayReturnDef returnDef = JSONSerializer.FromJSON<GatewayReturnDef>(result);
12 if (returnDef.Result)
13 LoggingManager.WriteLog(LogLevel.Information, new LogSeparator("\r\n"), "Release pc success.");
14 else
15 LoggingManager.WriteLog(LogLevel.Error, new LogSeparator("\r\n"), "Release pc failed.");
16 }
17 catch (Exception exception)
18 {
19 LoggingManager.WriteLog(LogLevel.Exception, new LogSeparator("\r\n"), "Error when invoke ReleasePC throw exception.", exception.Message, exception.InnerException);
20 }
21 }

    Note:这种方式需要引用WCF服务的提供的元数据,也就是接口DLL的引用,如果我在接口添加里面添加一个方法,那么我所引用的接口DLL也必须发生改变,这就导致了两者的耦合性升高,这种情况是不允许发生的,但也没说不允许使用,因为大部分情况下接口一旦定下来就不会变动,所以不要担心接口DLL的改动!

    Note:你也可以把这样的方法写成泛型,那么他的可扩展性就变得更好了!

 3.通过地址获取元数据,动态生成代理类,调用WCF服务

 1         private void ReleasePC(string ttgServiceURL, object[] args)
2 {
3 try
4 {
5 string serviceURL = ttgServiceURL + "/?wsdl";
6 DynamicProxyFactory factory = new DynamicProxyFactory(serviceURL);
7 DynamicProxy dynamicProxy = factory.CreateProxy("IGatewayWebService");
8 string result = (string)dynamicProxy.CallMethod("ReleasePC", args);
9 GatewayReturnDef returnDef = JSONSerializer.FromJSON<GatewayReturnDef>(result);
10 dynamicProxy.Close();
11 if (returnDef.Result)
12 LoggingManager.WriteLog(LogLevel.Information, new LogSeparator("\r\n"), "Release pc success.");
13 else
14 LoggingManager.WriteLog(LogLevel.Error, new LogSeparator("\r\n"), "Release pc failed.");
15 }
16 catch (Exception exception)
17 {
18 LoggingManager.WriteLog(LogLevel.Exception, new LogSeparator("\r\n"), "Error when invoke ReleasePC throw exception.", exception.Message, exception.InnerException);
19 }
20 }

  Note:如果上面两种方法不能适应项目需要的话,那么这就是最后的武器了,不过它的性能有点差,因为首先要获取元数据,然后再自动生成代理类,所以性能会不好

  这种方式是通过服务地址获取WCF的元数据(wsdl),然后在再客户端动态生成代理类(第一种情况已经帮我们生成好了代理类,第二种情况有了元数据,就差代理类,第三种是既没元数据又没代理类),所以关键的地方就是获取WCF服务的元数据!

  通过前辈们提供的公用类库,我们很容易的得到WCF服务提高的元数据,下面就是生成动态生成代理类的项目文件:动态创建WCF服务代理类

  注意事项(如果采用第三种方式获取元数据,需要注意下面的问题):

  如果你是个分布式服务的话,服务端的URL地址就不能使用“localhost”地址了,因为它是一个回传地址“127.0.0.1”,所以必须把它改为局域网地址或者公网地址,这个很重要呀,一定要切忌...

  学习WCF刻不容缓啦,o(∩_∩)o 哈哈...

学习之路十四:客户端调用WCF服务的几种方法小议的更多相关文章

  1. C# 调用WCF服务的两种方法

    项目简介 之前领导布置一个做单点登录的功能给我,实际上就是医院想做一个统一的平台来实现在这个统一的平台登录后不需要在His.Emr.Lis等系统一个个登录,直接可以登录到对应的系统,然后进行相应的操作 ...

  2. Silverlight客户端调用WCF服务难题解疑

    一:解决办法 Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平 ...

  3. 调用WCF服务的几种方式

    首先发布了一个名为PersonService的WCF服务.服务契约如下: [ServiceContract]     public interface IPersonService     {     ...

  4. Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

  5. Java与WCF交互(一):Java客户端调用WCF服务 【转】

    原文:http://www.cnblogs.com/downmoon/archive/2010/08/24/1807161.html 最近开始了解WCF,写了个最简单的Helloworld,想通过ja ...

  6. 客户端调用wcf服务,如何提高调用性能

    IO调用服务 1.使用using(每次自动释放) ; i < ; i++) { var watch = new Stopwatch(); watch.Start(); using (var cl ...

  7. 转载——Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

  8. IOS学习之路十四(用TableView做的新闻客户端展示页面)

    最近做的也个项目,要做一个IOS的新闻展示view(有图有文字,不用UIwebview,因为数据是用webservice解析的到的json数据),自己一直没有头绪,可后来听一个学长说可以用listvi ...

  9. zigbee学习之路(十四):基于协议栈的无线数据传输

    一.前言 上次实验,我们介绍了zigbee原理的应用与使用,进行了基于zigbee的串口发送协议,但是上个实验并没有实现数据的收发.在这个实验中,我们要进行zigbee的接受和发送实验. 二.实验功能 ...

随机推荐

  1. 使用EditText搜索listview里面的内容,实现Listview跟随变动的情况

    1.布局的XML文件里面添加EditText控件(省略)控件id=mSearch ListView的id=admin_lv; 2.一.获取ListView展示的数据(通过适配器获取) 二.这个是我要说 ...

  2. Hive学习之七《 Sqoop import 从关系数据库抽取到HDFS》

    一.什么是sqoop Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL ...

  3. RSA加密算法正确性证明

    RSA加密算法是利用大整数分解耗时非常大来保证加密算法不被破译. 密钥的计算过程为:首先选择两个质数p和q,令n=p*q. 令k为n的欧拉函数,k=ϕ(n)=(p−1)(q−1) 选择任意整数a,保证 ...

  4. archlinux的安装与简单配置(长期更新)

    安装部分较为较为简略,详细内容请查看arch的wiki 分区 cfdisk 格式化 mkfs.ext4 /dev/sdaX ... 挂载分区 mount /dev/sdaX /mnt ... 修改软件 ...

  5. MYSQL主从不同步延迟原理

    1. MySQL数据库主从同步延迟原理.   要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,   主库对所有DDL和DML产生binlog,binlog是 ...

  6. centos账户管理命令(root权限)

    cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1        查看所有用户 userdel -r 用户名           -删除用户 ...

  7. Java学习----main详解

    public class Test1 { public static void main(String[] args) { System.out.println("Hello"); ...

  8. js获取本月、三个月、今年的日期插件dateHelp

    最近看了一些关于面向对象的知识,最近工作中在做统计查询的时候需要用到本月.近三个月.今年的日期范围,所以下面用用面向对象的思想写了一个获取日期的插件,大家可以借鉴使用. 直接通过new DateHel ...

  9. webAPP前端必备知识

    了解各浏览器内核 Firefox:-moz-box-shadow Safari:-webkit-box-shadow Opera:-o-box-shadow IE:-ms-box-shadow Web ...

  10. MATLAB文件操作及读txt文件

    转自:http://blog.csdn.net/vblittleboy/article/details/8049748 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MA ...