平实学WCF

参照:

诚实学WCF 

http://blog.csdn.net/songyefei/article/details/7363296

第一篇 Hello WCF

第一篇 Hello
WCF

 

 

WCF(Windows Communication
Foundation)是微软集团推出的面向服务本事的集大成者,涵盖承接了其事先宣布的具备的布满式应用程序的编程模型,涉及面之广,本事之复杂,结构
之碎片,让大家初学那门技能的新手时常有四处出手的以为,此类别博文系小编艰苦探究WCF能力进度的读书笔记,作者抱着老老实实的神态,力图扎扎实实,安分守纪地球科学好那门技艺,文中难免有遗漏和不当之处,还请各位大牌不吝赐教。仅以此为与各位共同切磋,与求索WCF本领的同班们共勉。

WCF(Windows Communication
Foundation)是微软公司生产的面向服务能力的集大成者,涵盖承继了其后边公布的兼具的分布式应用程序的编制程序模型,涉及面之广,技巧之复杂,结构之碎片,让大家初学那门技巧的新手时常有到处动手的认为,此种类博文系笔者劳累探求WCF本事进度的上学笔记,作者抱着老老实实的千姿百态,力图扎扎实实,循规蹈矩地球科学好那门手艺,文中难免有遗漏和错误之处,还请各位大拿不吝赐教。仅以此为与各位共同研商,与求索WCF技艺的同班们共勉。

 

 

1.必备的基础知识

1.必备的基础知识

 

 

WCF技能涉及的知识点和概念庞杂零散,时常会被种种教材资料开头便抛出的众多名词概念弄晕,因而大家先领会供给的学问,尽快进入入手工编织码。

WCF本领涉及的知识点和定义庞杂零散,时常会被各个教材资料开头便抛出的过多名词概念弄晕,因而大家先了然须要的学问,尽快进入动手编码。

 

 

(1) 系列中的剧中人物。

(1) 连串中的角色。

在WCF的协会中,至少应该有多个剧中人物:服务端和客户端。服务端公开一个或四个劳务,客户端访问这么些服务以博取相应的逻辑。

在WCF的结构中,至少应当有多个剧中人物:服务端和客户端。服务端公开贰个或八个服务,客户端访问这么些服务以博取对应的逻辑。

(2) 服务(Service)和操作(Operation)

(2) 服务(Service)和操作(Operation)

服务端公开了贰个或多少个劳务,各类服务都兼备三个或多个操作,客户端通过调用服务的操作来博取劳动提供的逻辑。

服务端公开了三个或多少个劳务,每种服务都具有七个或四个操作,客户端通过调用服务的操作来获取劳动提供的逻辑。

(3) 终结点(EndPoint)

(3) 终结点(EndPoint)

服务端公开了服务和操作,客户端怎么着访问到他俩呢?正是通过终结点,终结点相当于劳动的地方,类似于门牌号,客户端就是循着这几个地点来找到服务和操作的。终结点是和劳务相对应的,找到了终结点就找到了劳动,找到了服务就获得了操作。

服务端公开了服务和操作,客户端怎么样访问到她们呢?便是经过终结点,终结点约等于劳动的地点,类似于门牌号,客户纠正是循着这么些地址来找到服务和操作的。终结点是和劳务相呼应的,找到了终结点就找到了劳动,找到了劳动就收获了操作。

(4) 绑定(Binding)

(4) 绑定(Binding)

绑定描述了客户端与服务端调换的法门,双方关系的语言,恐怕说协议,双方必须保持一致技能相互关联,比如三个服务端把劳务公开,供给必须用http协议来访问,那么此时绑定就是http绑定,客户端必须用http的格局来与那一个服务端通讯手艺访问到服务。

绑定描述了客户端与服务端交换的章程,双方联系的言语,或然说协议,双方必须保持一致技术相互联系,例如三个服务端把劳务公开,须要必须用http协议来访问,那么此时绑定正是http绑定,客户端必须用http的情势来与那个服务端通信技巧访问到劳动。

(5) 元数据(Metadata)

(5) 元数据(Metadata)

最近服务端公开了服务,客户端循着科学的终结点,持着科学的绑定找到了服务端,此时劳动端笑而不语,客户端不知道该如何做,因为客户
端根本不明了服务端公布了这个服务、操作、数据。客户端二个调用也写不出去。就算客户端不需理解服务和操作的现实贯彻细节,可是它必须掌握服务的接口描述
(或项目描述)、操作的秘诀签字,数据的类描述,那么些描述就叫做元数据,服务端必须经过某种形式把元数据交由客户端,这种方法叫做元数据沟通(Metadata Exchange)。

明日服务端公开了劳动,客户端循着正确的终结点,持着不错的绑定找到了服务端,此时服务端笑而不语,客户端不知所厝,因为客户端根本不掌握服务端发表了那个服务、操作、数据。客户端多少个调用也写不出来。即便客户端不需明白服务和操作的切实落实细节,不过它必须精晓服务的接口描述(或项目描述)、操作的办法具名,数据的类描述,这一个描述就叫做元数据,服务端必须通过某种方式把元数据提交客户端,这种方法叫做元数据沟通(Metadata
Exchange)。

询问了那个概念的大概意思就足以了,大家在后面慢慢切磋。

通晓了那么些概念的光景意思就足以了,大家在前边逐步研讨。

 

 

  1. 开首入手: Hello WCF
  1. 起始先导: Hello WCF

 

 

明日就从头入手工编织码,作者先证实一下小编的推行蒙受:

以往就初步先导工编织码,作者先验证一下本人的试验境遇:

Windows 7 家庭高档版

Windows 7 家庭高档版

.Net Framework 4.0

.Net Framework 4.0

Microsoft Visual Studio 2010 旗舰版 with Service Pack 1

Microsoft Visual Studio 2010 旗舰版 with Service Pack 1

 

 

(1) 创造服务端程序

(1) 创设服务端程序

WCF的服务必须有三个宿主来承载,那么些宿主的取舍过多,调节台程序、窗体程序、IIS、Windows服务等等。小编就选贰个最简便易行的调节台程序来承载。

用管理员权限运转VS2009,接纳文件菜单->新建->项目

图片 1

 

选择C#调控台应用程序,取名称叫HelloWCFService,放在Server文件夹下(待会儿的客户端放在Client文件夹下)

图片 2

 

如此那般,大家赢得了二个完完全全的调节台应用程序,唯有二个Program.cs。

图片 3

 

WCF的劳务必须有二个宿主来承载,这么些宿主的选项过多,调控台程序、窗体程序、IIS、Windows服务等等。小编就选多个最简便的调控台程序来承载。

用管理员权限运行VS二零零六,采取文件菜单->新建->项目

图片 4

 

选择C#调控台应用程序,取名字为HelloWCFService,放在Server文件夹下(待会儿的客户端放在Client文件夹下)

图片 5

 

诸如此类,大家收获了一个绝望的调节台应用程序,只有三个Program.cs。

图片 6

 

(2) 创设服务协定与落实劳务协定

(2) 制造服务协定与落到实处劳务协定

咱俩在前文的概念中打听到了劳务,这里又遇见了劳动协定,在此间有必不可缺实行一下,大家早就理解了什么是服务,然则服务到底是个
很暧昧的概念,在编制程序模型中,服务是何等兑现的呢?他的编制程序语言表示法又是何许吧,正是劳务协定(ServiceContract)与服务类(ServiceClass),一般境况下,大家把劳动协定表示为二个接口,然后用二个类去贯彻那个接口,完结那几个接口的类就称为服务类了。这一个接口和这一个类一同描述了一个劳务。编写接口的历程叫做创立服务协定,编写达成接口的类叫做达成劳务协定。比方表达:

上边包车型客车代码描述了哪些创制三个劳务协定

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

 

  1. [ServiceContract]  
  2. interface IHelloWCFService  
  3. {  
  4.     [OperationContract]  
  5.     string HelloWCF();  
  6. }  

具有标识为 [ServiceContract]
属性的接口都代表该接口是三个服务协定,全部标识为 [OperationContract]
属性的主意都意味着该方法是三个操作立下,服务协定和操作立下是足以被客户端调用到的,未有这个标记的接口和章程,服务端本地当然还足以用,然而客户端就访
问不到了。

 

开创了服务协定后,大家再写三个类去落到实处它,那么那些服务就有了实体,那一个实体是它逻辑真正存在的地点。例如表达:

上边包车型客车代码描述了怎么着贯彻贰个劳务协定

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

 

  1. public  class=”keyword”>class HelloWCFService:IHelloWCFService  
  2. {  
  3.     public  class=”keyword”>string HelloWCF()  
  4.     {  
  5.         return  class=”string”>”Hello WCF!”;  
  6.     }  
  7. }  

其一类落成了劳务协定接口而改为了服务类,他实现了操作立下HelloWCF(),逻辑很简短,再次回到贰个字符串”Hello
WCF!”。

 

[ServiceContract]和[OperationContract]性情也可职能于一般性的类和办法,大家也得以不编
写接口而直白把质量成效于HelloWCFService类,那样创设服务协定和贯彻劳务协定就合二而一了。不过推荐用接口和落到实处分开的法子,能够拉动灵
活性的帮助和益处,那几个自个儿体会的也十分少,等现在再拓展。

 

现行大家来入手。

在编写和落实服务协定在此之前,我们要先增加三个引用,WCF的焦点部件都在里面,他正是System.瑟维斯Model。右键点击化解方案管理器中的”引用”,选用”增多引用”

图片 7

 

选取.Net标签卡中System.ServiceModel程序集。

图片 8

 

丰硕完程序集引用后,大家要在源代码中程导弹入命名空间,加一条 using
System.ServiceModel;

图片 9

 

然后大家把劳动协定的概念和兑当代码输入,就在Program.cs中,写在Program类的背后。

图片 10

编译一下,没反常,到这里,服务协定的建设构造和兑现就旗开马到了。

大家在前文的概念中打探到了劳务,这里又碰着了劳动协定,在那边有供给开展一下,大家早就知道了哪些是劳务,不过服务到底是个很笼统的概念,在编制程序模型中,服务是哪些达成的吧?他的编制程序语言表示法又是什么样啊,正是劳务协定(ServiceContract)与服务类(ServiceClass),一般情形下,大家把服务协定表示为贰个接口,然后用贰个类去落到实处这些接口,达成那个接口的类就称为服务类了。那一个接口和这些类一齐描述了一个服务。编写接口的经过叫做创征服务协定,编写达成接口的类叫做完毕服务协定。比如表明:

上边包车型地铁代码描述了怎么着创造二个劳动协定

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

  1. [ServiceContract]  
  2. interface IHelloWCFService  
  3. {  
  4.     [OperationContract]  
  5.     string HelloWCF();  
  6. }  

有着标志为 [ServiceContract]
属性的接口都意味该接口是八个劳务协定,全体标识为 [OperationContract]
属性的情势都表示该措施是三个操作立下,服务协定和操作立下是足以被客户端调用到的,未有那么些标识的接口和方法,服务端本地当然还足以用,不过客户端就走访不到了。

 

创建了劳务协定后,我们再写贰个类去达成它,那么那一个服务就有了实体,那一个实体是它逻辑真正存在的地点。比如表明:

上边包车型大巴代码描述了什么贯彻一个劳动协定

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

  1. public  class=”keyword”>class HelloWCFService:IHelloWCFService  
  2. {  
  3.     public  class=”keyword”>string HelloWCF()  
  4.     {  
  5.         return  class=”string”>”Hello WCF!”;  
  6.     }  
  7. }  

本条类达成了劳动协定接口而成为了服务类,他贯彻了操作立下HelloWCF(),逻辑异常粗略,再次来到五个字符串”Hello
WCF!”。

 

[ServiceContract]和[OperationContract]属性也可职能于一般的类和形式,大家也足以不编写接口而直接把品质功效于HelloWCFService类,那样创制服务协定和兑现劳务协定就合二而一了。不过推荐用接口和贯彻分开的措施,能够拉动灵活性的亮点,这一个自家体会的也十分的少,等之后再开始展览。

 

当今大家来入手。

在编排和贯彻服务协定在此之前,大家要先增多贰个引用,WCF的宗旨部件都在中间,他正是System.ServiceModel。右键点击化解方案管理器中的”引用”,选取”增添引用”

图片 11

 

接纳.Net标签卡中System.ServiceModel程序集。

图片 12

 

增加完程序集引用后,我们要在源代码中程导弹入命名空间,加一条 using
System.ServiceModel;

图片 13

 

下一场大家把服务协定的概念和达成代码输入,就在Program.cs中,写在Program类的前面。

图片 14

编写翻译一下,没有毛病,到此地,服务协定的树立和实现就成功了。

(3) 配置和承继服务。

(3) 配置和承接服务。

大家写好了服务,接下去要在宿主中把它承前启后起来,本事被客户端访问和调用。WCF使用ServiceHost
的实例来承载服务,像大家这么的调整台程序,大家必要自个儿手动创设ServiceHost
实例,借使把劳务寄存在IIS 中,那么IIS会替大家转移和管理ServiceHost
实例。

 

大家精通,大家的服务端很大概承载着众多的劳动,每贰个劳动都有一个地址与之对应,而贰个服务可以公开多少个终结点,每叁个停止点都有三个地方,举例说,服务好象一栋房子,屋企的地址是唯一的,如和平大街1号,而终结点相当于房门,每一个房门都有个房门号,这些号码也是地点,他们是
分化的,可是通过那道门,你进去的都以以此房子。

更进一步说,大家所说的服务,实际上服务完结类本体(即HelloWCF瑟维斯),在头眼昏花的状态下,服务达成类本体大概落成多少个劳务协定接口,通过分化的服务协定接口访问服务达成类本体所得到的操作是不雷同的。服务协定接口的新闻是积攒在终结点中的,因而客户端循着不一致的终结点获得不一致的劳务协定,进而访问服务完结类而收获差异的操作,依然刚刚的例子,这栋服务的房舍或许有过多房屋,你从车库那些门(车库协定接口的收尾
点)进入屋子就只好获得车库的操作,而不可企及看到大厅里的事态。这就是多终结点(恐怕说多地点)能够对应同一服务的原由。

干什么插播这么多吧,那些要援救大家了然地方(Address)。假诺精通不了上边说的也没涉及,我们能够设想一下,有一家银
行(服务)坐落于和平大街1号。那几个银行有五个门,1号门和2号门。1号门是对公业务,2号门是对私业务。纵然某市肆要办理单笔贷款,那么那些专门的学问的人
(客户端) 就能循着地点找到1号门进来工作了。

那很好精晓。看上面四个概念:

服务位置:和平大街1号(即屋子的地点,即HelloWCFService服务的地点,只有八个)

终结点地址:和平大街1号1号门(即门的地址,即终结点的地址,存在多少个,各类终结点都有一个)

能够见到,终结点地址是劳动地点的子地址,或相对地址;服务地点是终结点地址的父地址,也称营地址(BaseAddress)。

 

好,大家重返瑟维斯Host,每三个ServiceHost
实例对应和管理二个服务,因此,在确立ServiceHost
之前,要先为其钦定三个营地址(即服务地方),这样ServiceHost
就会遵照驻地址来为团结管理的劳务建设构造的终结点的争持地址了。

 

上边包车型大巴代码建设构造多个Uri对象,那些指标能够作为军基址传送给ServiceHost。

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

 

  1. Uri baseAddress = new Uri( class=”string”>”http://localhost:8000/MyService“);  

此地运用的localhost
表示本机,捌仟端口是随便选的,只要不和系统保留端口冲突就足以了,前边的MyService是劳务地点,这么些名字能够不管起,和劳动落成类的名字同样也得以,他们未尝关联。

 

接下去,大家正式建构瑟维斯Host,由于我们唯有贰个服务(HelloWCFService类),所以只营造二个ServiceHost就能够了。

下边包车型大巴代码组建叁个ServiceHost对象

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

 

  1. ServiceHost host = new ServiceHost( class=”keyword”>typeof(HelloWCFService), baseAddress);  

ServiceHost
的构造函数接受七个参数,第一个参数集散地址就无须说了;第一个参数是服务类型,注意看这里是HelloWCFService类,而不是
IHelloWCFService接口,这里大家见到,服务的本体是服务完成类,而非协定接口,毕竟实实在在的逻辑在落到实处类里面,大家要留宿的是它。

 

劳务一度寄宿好了(还尚未运维,只是概念好了寄宿主),接下去要领会终结点了,就是为房屋造门了,门是属于屋子的,当然应该由屋子来顶住创立。

上面包车型地铁代码为劳动丰富多少个终结点

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

 

  1. host.AddServiceEndpoint( class=”keyword”>typeof(IHelloWCFService),  class=”keyword”>new WSHttpBinding(),  class=”string”>”HelloWCFService”);  

首先个参数钦定了劳动协定,请留意,这里是签订接口类型了,一个服务实现类大概达成三个劳务协定接口,那样各类服务协定接口都
有三个终结点与之对应了。第二个参数定义了绑定,即客户端与服务端沟通的方法,这里内定了二个wsHttpBinding的实例,第多个参数是终结点的地
址。这里给了二个对峙地址,终结点的末尾地址将会把那一个相对地址与营地址组合,即

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

 

  1. http://localhost:8000/MyService/HelloWCFService  

 

到那边,大家把宿主、服务、终结点都建好了,先把代码敲上去

图片 15

 

不用心急,不要心急,苏息,苏息会儿。

 

诸如此类是或不是就OK了吗?恩,还少了一些儿。

 

大家还未有启用元数据交换,也正是说客户端还未曾取得有关劳动协定的别的新闻,它不能做出任何调用。所以,大家得想个办法让服务端把团结的劳动协定元数据提交客户端。

启用元数据交流,是通过劳务元数据表现的相干设置来兑现的,要进行那上头的安装,首先要引进命名空间:
System.ServiceModel.Description

图片 16

 

接下去,我们创设多个劳务元数据作为指标。然后把它参预到宿主瑟维斯Host
对象的作为集合中去,那样元数据沟通就被张开了

以下代码创立一个劳务元数据表现目的

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

 

  1. ServiceMetadataBehavior smb =  class=”keyword”>new ServiceMetadataBehavior();  

构造函数未有参数,那便是大家可爱的。

 

劳务元数据表现存壹天质量HttpGetEnabled,大家要把它设为true
,那样,客户端就可用HTTP GET的点子从服务端下载元数据了。

以下代码设置HttpGetEnabled属性

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

 

  1. smb.HttpGetEnabled = true;  

 

最终,把这一个服务元数据表现指标加多到宿主ServiceHost
对象的行事集结中去。

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

 

  1. host.Description.Behaviors.Add(smb);  

    那样,服务的元数据交换就布置好了。(其实这么不算配置好,必须添英镑数据沟通终结点才行,只是.Net
    Framework 4.0替大家做了,现在再拓展)

 

我们把代码敲上去

图片 17

 

最终一步,运行宿主,开首服务。

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

 

  1. host.Open();  

    因为是调整台程序,大家必要丰硕一些输出和一些等候输入来维持程序的缕缕运维。等待用户输入大肆键停止程序

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

 

  1. Console.WriteLine( class=”string”>”Service is Ready”);  
  2. Console.WriteLine( class=”string”>”Press Any Key to Terminated…”);  
  3. Console.ReadLine();  

 

终极关闭宿主

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

 

  1. host.Close();  

    到此,服务的铺排和承继就成功了。代码敲上去

图片 18

以下是服务端程序的有着代码:

[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. class=”keyword”>using System.ServiceModel.Description;  
  8.   
  9. namespace HelloWCFService  
  10. {  
  11.     class Program  
  12.     {  
  13.         static  class=”keyword”>void Main( class=”keyword”>string[] args)  
  14.         {  
  15.             Uri baseAddress = new Uri( class=”string”>”http://localhost:8000/MyService“);  
  16.   
  17.             ServiceHost host =  class=”keyword”>new ServiceHost( class=”keyword”>typeof(HelloWCFService), baseAddress);  
  18.   
  19.             host.AddServiceEndpoint( class=”keyword”>typeof(IHelloWCFService),  class=”keyword”>new WSHttpBinding(),  class=”string”>”HelloWCFService”);  
  20.   
  21.             ServiceMetadataBehavior smb =  class=”keyword”>new ServiceMetadataBehavior();  
  22.             smb.HttpGetEnabled =  class=”keyword”>true;  
  23.             host.Description.Behaviors.Add(smb);  
  24.   
  25.             host.Open();  
  26.   
  27.             Console.WriteLine( class=”string”>”Service is Ready”);  
  28.             Console.WriteLine( class=”string”>”Press Any Key to Terminated…”);  
  29.             Console.ReadLine();  
  30.   
  31.             host.Close();  
  32.         }  
  33.     }  
  34.   
  35.     [ServiceContract]  
  36.     interface IHelloWCFService  
  37.     {  
  38.         [OperationContract]  
  39.         string HelloWCF();  
  40.     }  
  41.   
  42.     public  class=”keyword”>class HelloWCFService : IHelloWCFService  
  43.     {  
  44.         public  class=”keyword”>string HelloWCF()  
  45.         {  
  46.             return  class=”string”>”Hello WCF!”;  
  47.         }  
  48.     }              
  49. }  

    按F5运行一下,你见到程序是上面的规范。

 

图片 19

为了表明大家的宿主和服务运转寻常化,在地点的程序运营的时候,不要关掉它,然后展开浏览器,输入服务地点:

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

 

  1. http://localhost:8000/MyService  

如若您看来如下的镜头,就代表宿主和劳务运作符合规律化。

图片 20

 

咱俩写好了服务,接下去要在宿主中把它承前启后起来,工夫被客户端访问和调用。WCF使用瑟维斯Host
的实例来承载服务,像大家这么的调节台程序,大家须要团结手动创立ServiceHost
实例,倘诺把劳务寄存在IIS 中,那么IIS会替大家转移和管理ServiceHost
实例。

 

我们明白,大家的服务端十分大概承载着无数的劳动,每三个劳动都有二个地点与之对应,而八个服务可以公开八个终结点,每八个终结点都有多个地点,举个例子说,服务好象一栋房子,房屋的地点是唯一的,如和平大街1号,而终结点约等于房门,种种房门都有个房门号,那些编号也是地方,他们是分歧的,可是通过那道门,你进来的都以其一屋企。

更进一步说,大家所说的劳动,实际上服务完结类本体(即HelloWCFService),在纷纷的景况下,服务实现类本体可能实现五个劳务协定接口,通过不一致的劳动协定接口访问服务完毕类本体所获取的操作是差异等的。服务协定接口的消息是积攒在终结点中的,因而客户端循着不相同的终结点得到分裂的服务协定,进而访问服务达成类而获取分裂的操作,依然刚刚的事例,那栋服务的屋宇恐怕有好多房间,你从车库那些门(车库协定接口的终结点)进入屋家就只可以获得车库的操作,而不可能看出大厅里的情事。那正是多终结点(只怕说多地点)可以对应同一服务的原故。

为何插播这么多吗,这些要帮助大家掌握地方(Address)。纵然知道不了上边说的也没涉及,大家得以想象一下,有一家银行(服务)坐落于和平大街1号。这些银行有三个门,1号门和2号门。1号门是对公业务,2号门是对私业务。假诺某集团要办理一笔借款,那么这些工作的人(客户端)
就可以循着地点找到1号门进去职业了。

那很好明白。看上边七个概念:

劳务地点:和平大街1号(即屋子的位置,即HelloWCFService服务的地方,唯有多少个)

终结点地址:和平大街1号1号门(即门的地点,即终结点的地方,存在三个,各种终结点都有二个)

能够见见,终结点地址是劳动地点的子地址,或相对地址;服务地方是终结点地址的父地址,也称集散地址(BaseAddress)。

 

好,我们回去ServiceHost,每一个ServiceHost
实例对应和治本叁个劳务,由此,在确立ServiceHost
从前,要先为其钦命一个集散地址(即服务地点),那样ServiceHost
就能够依附驻地址来为温馨管理的劳务创设的终结点的绝对地址了。

 

上面包车型客车代码创设二个Uri对象,那一个指标足以看成军基址传送给ServiceHost。

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

  1. Uri baseAddress = new Uri( class=”string”>”http://localhost:8000/MyService“);  

那边运用的localhost
表示本机,8000端口是随意选的,只要不和类别保留端口争论就能够了,前边的MyService是劳务地点,这几个名字能够不管起,和劳动完成类的名字同样也得以,他们从没关联。

 

接下去,大家正式确立ServiceHost,由于大家只有一个服务(HelloWCFService类),所以只创设二个ServiceHost就足以了。

下边包车型地铁代码建设构造多个ServiceHost对象

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

  1. ServiceHost host = new ServiceHost( class=”keyword”>typeof(HelloWCFService), baseAddress);  

ServiceHost
的构造函数接受多个参数,第二个参数营地址就无须说了;第多少个参数是服务类型,注意看这里是HelloWCFService类,而不是IHelloWCFService接口,这里大家看来,服务的本体是劳务实现类,而非协定接口,终究实实在在的逻辑在完毕类里面,我们要留宿的是它。

 

劳动已经寄宿好了(还尚无运转,只是概念好了寄宿主),接下去要公开终结点了,正是为房子造门了,门是属于屋子的,当然应该由屋家来顶住构建。

下边包车型大巴代码为服务丰富叁个终结点

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

  1. host.AddServiceEndpoint( class=”keyword”>typeof(IHelloWCFService),  class=”keyword”>new WSHttpBinding(),  class=”string”>”HelloWCFService”);  

先是个参数内定了服务协定,请留心,这里是协定接口类型了,三个劳动实现类恐怕落成七个服务协定接口,这样各样服务协定接口都有多少个终结点与之对应了。第二个参数定义了绑定,即客户端与服务端调换的艺术,这里内定了三个wsHttpBinding的实例,第四个参数是终结点的地点。这里给了二个针锋相对地址,终结点的尾声地址将会把那些相对地址与营地址组合,即

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

  1. http://localhost:8000/MyService/HelloWCFService  

 

到这里,我们把宿主、服务、终结点都建好了,先把代码敲上去

图片 21

 

不要着急,不要着急,平息,休息一会儿。

 

如此那般是或不是就OK了啊?恩,还差点儿。

 

咱俩还从未启用元数据交换,也正是说客户端还尚未拿走有关劳动协定的别样音信,它不可能做出别的调用。所以,大家得想个办法让服务端把温馨的劳务协定元数据交由客户端。

启用元数据交流,是由此劳动元数据作为的有关安装来贯彻的,要拓展那上边的设置,首先要引进命名空间:
System.ServiceModel.Description

图片 22

 

接下去,大家成立三个服务元数据作为目的。然后把它进入到宿主瑟维斯Host
对象的一坐一起集结中去,那样元数据沟通就被打开了

以下代码创立贰个劳动元数据作为目的

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

  1. ServiceMetadataBehavior smb =  class=”keyword”>new ServiceMetadataBehavior();  

构造函数未有参数,那真是大家可爱的。

 

服务元数据作为有三个属性HttpGetEnabled,大家要把它设为true
,这样,客户端就可用HTTP GET的法子从服务端下载元数据了。

以下代码设置HttpGetEnabled属性

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

  1. smb.HttpGetEnabled = true;  

 

最终,把那几个服务元数据作为目的加多到宿主ServiceHost
对象的作为集合中去。

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

  1. host.Description.Behaviors.Add(smb);  

    诸如此类,服务的元数据沟通就布置好了。(其实那样不算配置好,必须添澳元数据交换终结点才行,只是.Net
    Framework 4.0替我们做了,今后再展开)

 

大家把代码敲上去

图片 23

 

最后一步,运维宿主,伊始服务。

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

  1. host.Open();  

    因为是调控台程序,我们必要加上一些出口和部分等待输入来保证程序的无休止运行。等待用户输入放肆键截止程序

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

  1. Console.WriteLine( class=”string”>”Service is Ready”);  
  2. Console.WriteLine( class=”string”>”Press Any Key to Terminated…”);  
  3. Console.ReadLine();  

 

最后关闭宿主

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

  1. host.Close();  

    到此,服务的安排和承继就产生了。代码敲上去

图片 24

以下是服务端程序的有所代码:

[csharp] view
plain
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. class=”keyword”>using System.ServiceModel.Description;  
  8.   
  9. namespace HelloWCFService  
  10. {  
  11.     class Program  
  12.     {  
  13.         static  class=”keyword”>void Main( class=”keyword”>string[] args)  
  14.         {  
  15.             Uri baseAddress = new Uri( class=”string”>”http://localhost:8000/MyService“);  
  16.   
  17.             ServiceHost host =  class=”keyword”>new ServiceHost( class=”keyword”>typeof(HelloWCFService), baseAddress);  
  18.   
  19.             host.AddServiceEndpoint( class=”keyword”>typeof(IHelloWCFService),  class=”keyword”>new WSHttpBinding(),  class=”string”>”HelloWCFService”);  
  20.   
  21.             ServiceMetadataBehavior smb =  class=”keyword”>new ServiceMetadataBehavior();  
  22.             smb.HttpGetEnabled =  class=”keyword”>true;  
  23.             host.Description.Behaviors.Add(smb);  
  24.   
  25.             host.Open();  
  26.   
  27.             Console.WriteLine( class=”string”>”Service is Ready”);  
  28.             Console.WriteLine( class=”string”>”Press Any Key to Terminated…”);  
  29.             Console.ReadLine();  
  30.   
  31.             host.Close();  
  32.         }  
  33.     }  
  34.   
  35.     [ServiceContract]  
  36.     interface IHelloWCFService  
  37.     {  
  38.         [OperationContract]  
  39.         string HelloWCF();  
  40.     }  
  41.   
  42.     public  class=”keyword”>class HelloWCFService : IHelloWCFService  
  43.     {  
  44.         public  class=”keyword”>string HelloWCF()  
  45.         {  
  46.             return  class=”string”>”Hello WCF!”;  
  47.         }  
  48.     }              
  49. }  

    按F5周转一下,你看看程序是底下的金科玉律。

 

图片 25

为了印证大家的宿主和劳动运作如常,在上头的程序运营的时候,不要关掉它,然后张开浏览器,输入服务地方:

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

  1. http://localhost:8000/MyService  

假诺你见到如下的画面,就象征宿主和劳动运作如常。

图片 26

 

(4) 创制和使用客户端

(4) 创建和利用客户端

 

 

接下去大家来访问户端的一部分,依旧是利用调控台应用程序。建立一个名称叫HelloWCFClient的C#调节台程序,放在Client文件夹下,方法同劳动器端。

图片 27

要调用服务端的劳动,必须先猎取服务协定和操作立下的叙述元数据,刚才我们曾经张开了服务端的元数据交流效能,以往能够直接去
下载了,VS二〇一〇提供了丰硕服务引用的作用,让大家很便利的获得服务的元数据(还足以行使Svcutil实用工具来生成元数据再包涵在客户端中,现在举行)。

 

第一要确认保证服务端的宿主是运作着的,然后右击客户端项目中的”引用”,选取”增多服务引用”。

图片 28

 

在弹出的对话框中的地址一栏输入服务端的服务地方,点击”前往”,VS二零一零会前往服务地点处下载元数据,然后告诉开掘的劳动,在底下的命名空间中为大家的元数据类型建立三个新的命名空间,这里能够轻便命名,笔者就把他命名字为MyService

图片 29

 

点击鲜明,我们得以看看引用中多了无数事物,那个都是元数据,具体内容未来再斟酌实行。

图片 30

 

增加完服务引用后,VS2009会为大家创设贰个客户端代理类,名字以劳动名+Client来命名,所以大家这里的代理类叫做HelloWCFServiceClient,就在大家刚刚
钦命的MyService命名空间下,我们成立三个这一个类的指标,然后经过这些指标来调用服务操作。

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

 

  1. MyService.HelloWCFServiceClient client =  class=”keyword”>new MyService.HelloWCFServiceClient();  

 

选择client 对象,大家就能够调用服务中公开的操作了。

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

 

  1. string strRet = client.HelloWCF();  

操作立下HelloWCF
是我们在服务协定中定义,在服务类中落到实处的,它回到二个字符串”Hello
WCF!”。大家树立八个string 变量来收纳它。

 

接下来大家把结果输出,并关闭代理。

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

 

  1. Console.WriteLine(strRet);  
  2. Console.ReadLine();  
  3.   
  4. client.Close();  

    从那之后,客户端的有的也达成,把代码敲上去。

图片 31

 

客户端部分的完好代码:

[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. namespace HelloWCFClient  
  7. {  
  8.     class Program  
  9.     {  
  10.         static  class=”keyword”>void Main( class=”keyword”>string[] args)  
  11.         {  
  12.             MyService.HelloWCFServiceClient client =  class=”keyword”>new MyService.HelloWCFServiceClient();  
  13.   
  14.              class=”keyword”>string strRet = client.HelloWCF();  
  15.   
  16.             Console.WriteLine(strRet);  
  17.             Console.ReadLine();  
  18.   
  19.             client.Close();  
  20.         }  
  21.     }  
  22. }  

    按F5周转客户端程序,记得此时必须保证服务端程序是运转着的,你相会到下面的结果

图片 32

 

居功至伟告成,第五个WCF 程序实现了

 

Hello WCF!

 

接下去大家来拜会户端的一些,如故是采纳调控台应用程序。建构二个名字为HelloWCFClient的C#调整台程序,放在Client文件夹下,方法同服务器端。

图片 33

要调用服务端的服务,必须先获得服务协定和操作立下的讲述元数据,刚才大家早已打开了服务端的元数据交流成效,现在能够直接去下载了,VS2009提供了增进期服用务引用的功能,让大家很有益于的取得服务的元数据(还是能动用Svcutil实用工具来生成元数据再包涵在客户端中,现在实行)。

 

首先要保管服务端的宿主是运维着的,然后右击客户端项目中的”引用”,选拔”增加服务引用”。

图片 34

 

在弹出的对话框中的地址一栏输入服务端的劳务地方,点击”前往”,VS二〇〇八会前往服务地点处下载元数据,然后告诉开掘的服务,在上面包车型地铁命名空间中为大家的元数据类型创设二个新的命名空间,这里能够私自命名,我就把他命名叫My瑟维斯

图片 35

 

点击分明,大家得以看出引用中多了数不尽事物,那么些都以元数据,具体内容今后再切磋进展。

图片 36

 

增加完服务引用后,VS贰零零玖会为大家创造一个客户端代理类,名字以服务名+Client来命名,所以大家这里的代理类叫做HelloWCFServiceClient,就在我们恰好钦定的My瑟维斯命名空间下,大家创制二个这一个类的目的,然后经过这些目的来调用服务操作。

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

  1. MyService.HelloWCFServiceClient client =  class=”keyword”>new MyService.HelloWCFServiceClient();  

 

行使client 对象,大家就足以调用服务中公开的操作了。

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

  1. string strRet = client.HelloWCF();  

操作立下HelloWCF
是我们在服务协定中定义,在劳务类中落到实处的,它回到贰个字符串”Hello
WCF!”。我们树立叁个string 变量来接收它。

 

然后大家把结果输出,并关闭代理。

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

  1. Console.WriteLine(strRet);  
  2. Console.ReadLine();  
  3.   
  4. client.Close();  

    时至前几天,客户端的局地也旗开马到,把代码敲上去。

图片 37

 

客户端部分的完整代码:

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

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace HelloWCFClient  
  7. {  
  8.     class Program  
  9.     {  
  10.         static  class=”keyword”>void Main( class=”keyword”>string[] args)  
  11.         {  
  12.             MyService.HelloWCFServiceClient client =  class=”keyword”>new MyService.HelloWCFServiceClient();  
  13.   
  14.              class=”keyword”>string strRet = client.HelloWCF();  
  15.   
  16.             Console.WriteLine(strRet);  
  17.             Console.ReadLine();  
  18.   
  19.             client.Close();  
  20.         }  
  21.     }  
  22. }  

    按F5运维客户端程序,记得此时必须有限支撑服务端程序是运作着的,你会面到下边包车型地铁结果

图片 38

 

居功至伟告成,第叁个WCF 程序完结了

 

Hello WCF!

 

  1. 总结
  1. 总结

通过这么些事例,大家以最简便的不二诀要贯彻了多个WCF
程序,大家应该领会一个WCF 程序最基本的编制程序步骤。

(1) 定义服务协定接口和接口中的操作立下。

(2) 用二个服务类完成劳务协定接口和接口中的操作立下。

(3) 组建二个宿主程序用来存放服务。

[针对调整台程序宿主]

(4) 为服务创设ServiceHost 对象并钦定要存放的服务类和劳动营地址。

(5) 为ServiceHost
增加终结点,钦赐其服务协定、绑定类型和终结点地址(或相对地址)。

(6) 为瑟维斯Host
增添服务元数据表现指标,要将该对象的HttpGetEnabled属性设为true
以运行元数据沟通。

(7) 启动ServiceHost。

(8) 构建客户端。

(9) 为客户端增加指向服务营地址的劳务引用以下载元数据。

(10) 客户端使用代理类调用服务操作。

 

总结。

(1) 定义服务协定。

(2) 完毕服务协定。

(3) 配置和确立宿主。

(4) 配置和创造客户端。

(5) 调用服务。

经过那么些事例,我们以最简便易行的点子贯彻了二个WCF
程序,大家应有掌握一个WCF 程序最大旨的编制程序步骤。

(1) 定义服务协定接口和接口中的操作立下。

(2) 用多少个服务类完毕服务协定接口和接口中的操作立下。

(3) 建构一个宿主程序用来存放服务。

[针对调整台程序宿主]

(4) 为服务创建ServiceHost 对象并钦赐要存放的服务类和服务营地址。

(5) 为ServiceHost
增加终结点,内定其服务协定、绑定类型和终结点地址(或相对地址)。

(6) 为ServiceHost
增添服务元数据表现指标,要将该目的的HttpGetEnabled属性设为true
以运转元数据沟通。

(7) 启动ServiceHost。

(8) 创设客户端。

(9) 为客户端加多指向服务集散地址的劳动引用以下载元数据。

(10) 客户端使用代理类调用服务操作。

 

归纳。

(1) 定义服务协定。

(2) 完成服务协定。

(3) 配置和建设构造宿主。

(4) 配置和树立客户端。

(5) 调用劳动。

  1. 连带能源
  1. 连锁财富

徐长龙先生播讲的MSDN Webcast 教程<<跟自个儿一起从零伊始学WCF>>

http://msdn.microsoft.com/zh-cn/hh148206

 

MSDN 工夫能源库中 WCF的入门教程,本例首要参照他事他说加以考查该科目

http://msdn.microsoft.com/zh-cn/library/ms734712.aspx

徐长龙先生播讲的MSDN Webcast 教程<<跟自家一同从零伊始学WCF>>

http://msdn.microsoft.com/zh-cn/hh148206

 

MSDN 才能财富库中 WCF的入门教程,本例主要参照该科目

http://msdn.microsoft.com/zh-cn/library/ms734712.aspx