[老老实实学WCF] 第4篇 再探通讯–ClientBase

cls  清屏

在上一篇中,大家抛开了劳务引用和元数据调换,在客户端中手动添加了元数据代码,并使用通道工厂ChannelFactory<>类创立了大路,达成了和服务端的通讯。但是,与服务端通讯的编制程序模型不只一种,后日我们来学学应用别的二个服务类ClientBase<>来形成
同样的行事,了然了那个类的运用方法,大家对服务引用中的关键部分就可见掌握了。

 

由此本篇的求学,大家理解了另一种与服务端通讯的章程,即透过ClientBase<>派生代理类的措施,那种措施其实就是劳动引用使用的不二法门,能够说小编们早已在最简便易行级别上手写了3个服务引用的兑现。

 

利用ChannelFactory<>和ClientBase<>都能够兑现与服务端的通信,那是类
库援救的参天层次的报纸发表方式了,其实还有更底层的大道通信格局,大家今后就不再深刻了。而选拔这二种方式完全在于开发人士,有人喜欢工厂,有人欢乐代理
类。既然大家都曾经精晓了,就自由选取吧。

 

迄今结束,大家对通信有了二个着力的垂询,只可以算2个初探吧。可是小编深信不疑这一遍的小小深远会对我们随后的求学带来大大的援助的。

 

  1. 累加须求的引用

组合成分:

 

2.不得以接纳首要字

地点已经关系,大家要协调写二个新类来继承ClientBase<>基类,那样那么些新类就是代理类了,同时,为了
能够用代理类间接调用服务协定的法子,咱们还要让代理类实现劳务协定的接口,注意,继承要写在前面,完结接口要写在末端。大家把这一个类起名为
HelloWCFClient。

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. public  class=”keyword”>class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
  2. {   
  3.   
  4. }  

提须要ClientBase的泛型参数应该是劳务协定,那样她才能帮我们建立科学的大路,同时,代理类也落到实处服务协定接口。

 

ClientBase<>有无数的构造函数,接受差异类其他参数来创建代理类对象,其实这个参数都以元数据消息,
刚才我们早已经过泛型参数字传送递给基类服务协定那个元数据了,以往基类还亟需绑定和终结点地址那三个元数据才能科学制造连接,所以我们继承的新类应该把那一个构造函数给覆载一下经受那三种元数据参数并传递给基类。

上边我们为新创立的代办类添加二个构造函数:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. public  class=”keyword”>class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
  2. {  
  3.      class=”keyword”>public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
  4.         :  class=”keyword”>base(binding, remoteAddress)  
  5.     {   
  6.       
  7.     }  
  8. }  

大家看到这一个新建的构造函数什么也没做,只是接受了多个参数,三个是绑定,1个是终结点地址,然后直接调用基类(也正是ClientBase<>)的构造函数,把那一个七个参数字传送递了上来。其实工作都以ClientBase<>做的,咱们新建的类就是个传话的,要不然怎么叫代理呢,他怎么着活都不干。

 

既然我们兑现了劳动协定接口,当然要贯彻接口的点子了。下边大家把艺术的落到实处写下去:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. public  class=”keyword”>class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
  2. {  
  3.      class=”keyword”>public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
  4.         :  class=”keyword”>base(binding, remoteAddress)  
  5.     {   
  6.       
  7.     }  
  8.   
  9.     public  class=”keyword”>string HelloWCF()  
  10.     {  
  11.         return  class=”keyword”>base.Channel.HelloWCF();  
  12.     }  
  13. }  

别忘了你的地步,凡人!大家那是在客户端啊,怎么恐怕有服务协定吗?这一个能够有,可是这些达成不是大家在做,而是要和劳动端通信让服务端做,那里能够看到代理显然的特色了,代理类就算完成了劳务协定的艺术,可是在方式中,他调用了基类(便是ClientBase<>)上的大路,并通过通道调用了了协定方法。此时,ClientBase<>已经为咱们建立好与服务端的
通道了,而且是用服务协定建立的,大家本来可以在通道上调用服务协定的主意。所以调用代理类对象的HelloWCF()的进程是代理类委托基类在早就确立
好的劳务协定通道上调用协定方法,并从服务端获得再次来到值,然后再再次回到给代理类对象的调用者。狗腿啊狗腿。

基本上分为4大类

ClientBase<>类也是多个泛型类,接受服务协定作为泛型参数,与ChannelFactory<>不一致的是,这个类是四个基类,即抽象类,是不可能实例化成对象间接使用的,我们须要团结写2个类来连续那几个类,我们新写的类实例化出来正是客户端代理了,这么些指标足以调
用基类的有的受保证的措施来完毕通讯。ClientBase<>为大家封装的很好,我们只必要写个新类来一而再他就足以了,通讯的无数局地他都
替大家做好了,比如大家不用举办去创制通道和开拓通道的操作,直接调用协定方法就能够了。那也是劳务引用和别的元数据变动工具(如svcutil)使用那一个类来组织客户端代理的缘由。

/**  文书档案注释  */

  1. 再开始展览一丝丝

1.数字不能够开首

 

dir  查看该文件夹下的富有剧情

诚实学WCF

规则:

 

JDK 开发运作条件  程序要写代码需求下载的,JDK包罗JRE、JVM

咱俩一方面动手一边学习

浮点类型(小数)  float  double  (默许为double);

如此那般看上去已经挺成功了,大家现在再打开服务引用的reference.cs代码,看看是或不是绝超过一半都看得懂了?监禁有个别地点他写的可能有点复杂,比如描述协定的质量参数啊,代理类更多的构造函数啊,不过焦点的就是大家恰好写的局地,那一大堆wsdl什么的骨子里都不是基本,不信
的话你把她们都删掉,就留1个reference.cs看看好在不好用?那一堆东西也不是没用正是今后友赏心悦目起来还蛮复杂的,大家到末端一丝丝读书。

 

咱俩仔细看服务引用的reference.cs代码,有相同东西是我们有而她没有的,那便是对终结点地址和绑定的创造,而且在利用服务引用的时候大家也尚无提供之两样东西,直接掉服务协定方法就行了(见第叁篇),那么服务引用是从哪个地方找到那多少个基本点的元数据成分呢?

 

就在安插文件里,大家做的客户端还从未布署文件,我们可以把那七个要素都坐落配置文件里,这样就足以制止硬编码了。

 

为大家的控制台应用程序添加一个应用程序配置文件。方法是右键点击项目->添加->新建项->应用程序配置文件。保持暗中同意名称app.config。

打开来看,里面没写什么实际的内容:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. <?xml  class=”attribute”>version= class=”attribute-value”>”1.0″  class=”attribute”>encoding= class=”attribute-value”>”utf-8″  class=”tag”>?>  
  2. <configuration class=”tag”>>  
  3. </configuration class=”tag”>>  

    大家对配置服务应该不不熟悉,倘使忘记了,翻回到第2篇去回想一下。

先是照旧要添加<System.ServiceModel>节,无论是服务端依旧客户端,只假诺WCF的劳动配置都要在这么些节里面:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. <?xml  class=”attribute”>version= class=”attribute-value”>”1.0″  class=”attribute”>encoding= class=”attribute-value”>”utf-8″  class=”tag”>?>  
  2. <configuration class=”tag”>>  
  3.   < class=”tag-name”>system.serviceModel class=”tag”>>  
  4.       
  5.   </ class=”tag-name”>system.serviceModel class=”tag”>>  
  6. </configuration class=”tag”>>  

    在那里大家要布局的是客户端,所以大家不添加<Services>节了,而改成<Client>:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. <?xml  class=”attribute”>version= class=”attribute-value”>”1.0″  class=”attribute”>encoding= class=”attribute-value”>”utf-8″  class=”tag”>?>  
  2. <configuration class=”tag”>>  
  3.   < class=”tag-name”>system.serviceModel class=”tag”>>  
  4.     <client class=”tag”>>  
  5.         
  6.     </client class=”tag”>>  
  7.   </ class=”tag-name”>system.serviceModel class=”tag”>>  
  8. </configuration class=”tag”>>  

    下一场大家在<Client>中添加二个终结点,那个是客户端的终结点,大家前面已经提过,通讯实际上产生在几个终结点间,客户端也有个了结
    点,不过请求总是从客户端首首发起,所以终结点地址应该填写为服务端终结点的地方让客户端来寻址,然而服务协定要客户端本地是部分,所以这么些要写本地定义
    的非凡协定的完全限定名:

[html] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. <?xml  class=”attribute”>version= class=”attribute-value”>”1.0″  class=”attribute”>encoding= class=”attribute-value”>”utf-8″  class=”tag”>?>  
  2. <configuration class=”tag”>>  
  3.   < class=”tag-name”>system.serviceModel class=”tag”>>  
  4.     <client class=”tag”>>  
  5.       <endpoint  class=”attribute”>binding= class=”attribute-value”>”wsHttpBinding”  class=”attribute”>address= class=”attribute-value”>”http://localhost/IISService/HelloWCFService.svc”  class=”attribute”>contract= class=”attribute-value”>”ConsoleClient.IHelloWCF” class=”tag”>/>  
  6.     </client class=”tag”>>  
  7.   </ class=”tag-name”>system.serviceModel class=”tag”>>  
  8. </configuration class=”tag”>>  

假设您忘掉了大家在第贰篇中安插的IIS服务的始末,大概稍有迷惑,那里的地点看上去是个服务地点而不是终结点地址,那是因为
大家在IIS中把终结点地址设置为了空字符串,此时劳动地点正是终结点地址了。注意看后面包车型大巴contract,他的通通限定名的命名空间是客户端程序的命
名空间ConsoleClient,那也表示这么些项目是概念在该地的,不要搞错了。

 

保留,配置已经写完了,你假如看服务引用为我们转变的铺排会看出一堆东西,实际上焦点的就是那些。

 

既是大家早就在安顿中扬言了绑定和终结点地址,在代码中就不再须求了。

先是大家修改一下代理类,为她提供叁个尚无参数的构造函数,不然在new他的时候他会非管大家要八个参数。

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. public HelloWCFClient()  
  2.     : base()  
  3. {   
  4.   
  5. }  

抑或如何也不做,直接调基类的无参构造函数。

 

下一场修改一下Main函数,去掉终结点对象和地址对象的扬言,并用无参构造函数来new
代理类的实例:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. static void Main( class=”keyword”>string[] args)  
  2. {  
  3.     HelloWCFClient client =  class=”keyword”>new HelloWCFClient();  
  4.   
  5.      class=”keyword”>string result = client.HelloWCF();  
  6.   
  7.     client.Close();  
  8.   
  9.     Console.WriteLine(result);  
  10.     Console.ReadLine();  
  11. }  

    F5运转一下,结果如一吧!

到那里已经和劳务引用的感到基本一致了,大家曾经写出了服务引用的着力部分。

以下是修改后的Program.cs完整代码:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. using System.ServiceModel;  
  7.   
  8. namespace ConsoleClient  
  9. {  
  10.     class Program  
  11.     {  
  12.         static  class=”keyword”>void Main( class=”keyword”>string[] args)  
  13.         {  
  14.             HelloWCFClient client =  class=”keyword”>new HelloWCFClient();  
  15.   
  16.              class=”keyword”>string result = client.HelloWCF();  
  17.   
  18.             client.Close();  
  19.   
  20.             Console.WriteLine(result);  
  21.             Console.ReadLine();  
  22.         }  
  23.     }  
  24.   
  25.     [ServiceContract]  
  26.     public  class=”keyword”>interface IHelloWCF  
  27.     {  
  28.         [OperationContract]  
  29.         string HelloWCF();  
  30.     }  
  31.   
  32.     public  class=”keyword”>class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
  33.     {  
  34.         public HelloWCFClient()  
  35.             : base()  
  36.         {   
  37.           
  38.         }  
  39.   
  40.          class=”keyword”>public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
  41.             :  class=”keyword”>base(binding, remoteAddress)  
  42.         {   
  43.           
  44.         }  
  45.   
  46.         public  class=”keyword”>string HelloWCF()  
  47.         {  
  48.             return  class=”keyword”>base.Channel.HelloWCF();  
  49.         }  
  50.     }  
  51. }  

字符类型  char  String;

  1. 编写程序主体

常用DOS命令

我们依旧不用服务引用,完全手写,本次如故建立二个控制台应用程序作为客户端。

布尔类型  boolean

大家用到的ClientBase<>类在System.ServiceModel程序集中,由此,要丰硕那一个程序集的引用,同时在program.cs中添加using语句

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. using System.ServiceModel;  

这一步应该很熟了,假设有问号,重回前几篇温习一下。

数字类型  byte  short  int  long  (暗中同意为int);

  1. 总结

/*  多行注释  */

  1. 编写服务协定

JRE
运转环境    JAVA运维的条件,比如客户需求实行,只供给安装JRE,不须要安装JDK

因为从没使用服务引用,客户端今后未曾其余元数据的音讯,大家要来手写。首先把服务协定写进去。那一个再熟习然则了(写在Program类后边):

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. [ServiceContract]  
  2. public  class=”keyword”>interface IHelloWCF  
  3. {  
  4.     [OperationContract]  
  5.     string HelloWCF();  
  6. }  

 

  1. 编纂客户端代理类

 

代理类已经写完了,大家前几天始发写程序的大旨,让大家来到Program的Main函数中。

依然有一些预备要做,还差四个元数据吧,对了,便是绑定和地方。和上一篇一样,大家先成立这几个三个元数据的目的备用:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. WSHttpBinding binding =  class=”keyword”>new WSHttpBinding();  
  2. EndpointAddress remoteAddress =  class=”keyword”>new EndpointAddress( class=”string”>”http://localhost/IISService/HelloWCFService.svc“);  

    接下去就要创造大家的代理类对象了,new二个出来吧:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. HelloWCFClient client =  class=”keyword”>new HelloWCFClient(binding, remoteAddress);  

把大家刚刚确立的三个元数据对象作为参数字传送递进去。

 

接下去就足以调用服务协定方法了:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. string result = client.HelloWCF();  

    别忘了关闭通道,ClientBase<>很接近的为大家准备了这几个方法,不用再做强制类型转换什么的了(见前一篇)。

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. client.Close();  

    最后再添加输出语句来看结果:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. Console.WriteLine(result);  
  2. Console.ReadLine();  

    F5转眼,熟知的结果是还是不是出新了?

 

以下是Program.cs的全体代码:

[csharp] view
plain
class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″>
copy

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. using System.ServiceModel;  
  7.   
  8. namespace ConsoleClient  
  9. {  
  10.     class Program  
  11.     {  
  12.         static  class=”keyword”>void Main( class=”keyword”>string[] args)  
  13.         {  
  14.             WSHttpBinding binding =  class=”keyword”>new WSHttpBinding();  
  15.             EndpointAddress remoteAddress =  class=”keyword”>new EndpointAddress( class=”string”>”http://localhost/IISService/HelloWCFService.svc“);  
  16.   
  17.             HelloWCFClient client =  class=”keyword”>new HelloWCFClient(binding, remoteAddress);  
  18.   
  19.              class=”keyword”>string result = client.HelloWCF();  
  20.   
  21.             client.Close();  
  22.   
  23.             Console.WriteLine(result);  
  24.             Console.ReadLine();  
  25.         }  
  26.     }  
  27.   
  28.     [ServiceContract]  
  29.     public  class=”keyword”>interface IHelloWCF  
  30.     {  
  31.         [OperationContract]  
  32.         string HelloWCF();  
  33.     }  
  34.   
  35.     public  class=”keyword”>class HelloWCFClient : ClientBase<IHelloWCF>, IHelloWCF  
  36.     {  
  37.          class=”keyword”>public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)  
  38.             :  class=”keyword”>base(binding, remoteAddress)  
  39.         {   
  40.           
  41.         }  
  42.   
  43.         public  class=”keyword”>string HelloWCF()  
  44.         {  
  45.             return  class=”keyword”>base.Channel.HelloWCF();  
  46.         }  
  47.     }  
  48. }   

1.英文字符: a-zA-Z

第⑤篇 再探通讯–ClientBase

数据类型 

  1. 建立客户端程序

//  单行注释

 

3.严俊不一样学轻工重缓急写,不限制长度起名时,尽量达到见名知意

JVM 虚拟机      
JAVA运营的载体,JAVA并不直接运营在操作系统上,而是运维在JVM虚拟机上,所以JAVA能够跨平台选拔

f:进入盘符

 

3.符号: _与$

cd /****   进入文件夹

标识符

2.数字: 0-9

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图