认识Windows Communication Foundation

            很久没有写博客,做为一个程序员,我竟然习惯了不写博客。也难怪这些年来,一直原地踏步,无所长进。真是一份付出一份收获,种瓜得瓜,种豆得豆。html

Windows Communication Foundation   是一种很是实用、很是强大的技术。属于.NET范畴内的,微软推出的技术。在这个.NET即将失去市场的日子里,也只有WCF这个技术还有点价值,还能够获得市场的承认。为了提高本身的价值,要好好学习一些实用、值钱的技术。java

                                                          

Where Is WCF Come From

            wcf是什么?为何是一项值钱的技术?在开始说明wcf是什么、wcf的价值以前,让咱们先回顾一下早些日子里的我的电脑应用程序是如何工做的,这样有助于理解,为何会推出wcf这项技术。在最初的日子里,我的电脑应用软件都很是匮乏且不能够多个任务同时进行。例如: word processor(文字处理器) 、spreadsheet(电子表格)、database(数据库)。通常用户,使用数据库存储业务数据,用电子表格分析数据,最后经过文字处理器将这些数据整理作出报表。这些个应用程序之间不能相互通讯、交互操做,而且必选安装在相同的一台电脑上。随着网络的不断发展,人们对数据共享的要求愈来愈急迫。例如,在一个公司内的员工,须要共享数据,那么就须要各个应用软件间互相通讯、互相交互,且这些应用软件能够安装在不一样的电脑上。程序员

        此时,就出现了Inter-Process communication技术(进程间通讯)。例如 named pipe、sockets,这些技术的出现,使得应用程序之间能够相互交互、通讯、互相发送信息、协同完成任务。可是,这些技术都是很是底层的网络技术,对开发人员要求极高,大大增强了开发人员的工做量。随着技术的快速发展,微软又相继推出了Component Object Model(COM)、Distributed Component Object Model(DCOM)、COM+、.NET Framework、Remoting 等技术。这些技术,都是为了实现应用程序与组件之间相互通讯的。web

     既然有这么多技术来支持应用程序与组件之间通讯,那为何还须要推出WCF这项技术呢?它又为何比其余技术更值钱呢?若是咱们平常需求只停留在局域网内,各个软件之间共享数据、发送、接收数据,协同完成任务这个层面,那么以上那些技术已经能够很好的知足咱们的需求了,根本不须要使用WCF这项技术。可是,随着World wide web的快速发展,出现了web Service这个概念。web service,是指在服务器上执行的应用程序或组件。也就是说,咱们使用的应用程序或者服务,不是本地安装软件,而是经过World wide web来访问部署这些应用软件的服务器,来获取服务。咱们在平日的项目开发中,特别是前台开发,咱们都会常用Ajax技术来实现页面局部刷新,或者经过Ajax调用后台代码,完成对数据库的增删改查。其实,Ajax就算一种web service常用的技术 .web service概念与另外一个概念联系紧密,Service-Oriented Architecture(SOA 面向服务架构). 功能以接口的形式提供给用户,接口的实现,对用户透明,用户不会看到接口的实现,也不须要关注接口的实现。接口的实现,可使用已有的软件功能或者其余的web service。面向服务的体系结构,就是分布式服务。数据库

   经过以上对web service 与SOA的理解,你们能够看出,其实分布式服务的实质,就是经过网络与各个应用服务、组件相互接收信息、回复信息、协同合做。这些应用服务、组件能够部署在世界上的任何地方,不在像以前那么,局限在一个公司的局域网中。WCF就是为了建立web service而推出的技术。web service是一种服务,它不依赖于开发语言与部署服务器环境。使用java等其余语言,也能够实现一个web service。浏览器

 

The  Benefits Of WCF

           要想实现应用程序与web service的通讯,就要考虑如下几点:安全

     1.传输数据的格式服务器

     2.传输使用的协议网络

     3.数据安全架构

     以上这些问题,都是须要双方认同的、须要保持一致的。只有这样,才能够互相通讯。web service使用XML 或者JASON做为数据传输的格式。使用Simple Object Access Protocol(SOAP)协议进行相互通讯。SOAP协议定义了:

    1.SOAP协议消息的格式

   2.传输数据如何加密

   3.怎样对SOAP消息回复

web service能够发布Web Service Description Language(WSDL)文档,这个文档是由XML形式展现的,描述了Web Service能够接收的消息、以及返回的消息结构。客户端应用程序经过WSDL文档来决定如何与Web Service进行通讯。

以上的这些,WCF会提供一个模型,很方便配置以上内容。

Building WCF Service

  接下来,咱们来动手开发一个WCF服务。要开发的WCF包含两部分:WCF服务、客户端应用程序。将开发好的WCF服务部署到IIS上,客户端应用程序调用服务。

WFC能够基于多种类型的模板开发,例如网站、类库、工做流等。今天咱们使用网站模板来开发WCF服务。

1、  先建立一个空的解决方案,名称为TestService.

2、 双击解决方案->新增->新网站。 弹出的窗口,选择WCFService.以下图:

WeChat Image_20180626220732_副本

3、建立WCF Service 后,以下图:

WeChat Image_20180626221918

我将网站起名字为PracticeService, 图中被红色圈中的是WCF 服务,TestService是客户应用程序,待会下面会讲到。

在App_Code文件下,会出现两个类:IService.cs 、Service.cs。我将对应的两个类改成了:IPracticeService.cs  Practice.cs。

 

Definition Contract

 
 
 
 WCF包含,Service Contract(服务契约)、Data Contract(数据契约)、Operation Contract(操做契约)、Member Contract(数据成员契约)。
Service Contract:向外界提供的服务。只有标注为Service Contract 的接口,才能被外界以服务的形式看到。
Operation Contract:接口内的方法,只用被Operation Contract属性定义后,才能够被外界调用。
Data Contract:只有被Data Contract 属性定义后的类,才可被WCF序列化、反序列成符合XML Schema(XML架构)的数据流。从客户端至WCF服务,数据类型必定要符合XML Schema.客户端发送数据至WCF,先将数据类型系列化成XML流,到达WCF服务端后,WCF将XML数据流,反序列化成.NET对象,反之亦然。因而可知,只要是须要传输的类,必需要具备Data Contract.(Data Contract 属性能够定义在类、结构、枚举上)。
Data Member:被传输的类中字段,须要被Data Member属性标记,才能够被访问。
如下是IPracticeService.cs代码段:
using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; namespace Test { [ServiceContract] public interface IPracticeService { [OperationContract] List<string> GetAllGirl(); [OperationContract] Girl GetSpecificGirl(string Id);  // TODO: Add your service operations here  } // Use a data contract as illustrated in the sample below to add composite types to service operations.  [DataContract] public class Girl { [DataMember] public string Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Age { get; set; } [DataMember] public string Marry { get; set; } } }
这是一个被Service Contract属性标记的接口,也是WCF服务提供的服务。接口内的方法,被Operation Contract属性标记过,才能够被访问。定义了一个Girl类,使用Data Contract标记,其中字段使用DataMember属性标记。这个接口提供了一下几个功能:
1.获取全部女孩子信息
2.获取具体某个女孩子信息
 
令Practice.cs类实现IPractice接口,下面是Practice实现类代码段:
using System.Collections.Generic; // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service" in code, svc and config file together. namespace Test { public class Practice : IPracticeService { public List<string> GetAllGirl() { List<string> collect = new List<string>(); string name = "MARY"; collect.Add(name); name = "CHRISTINE"; collect.Add(name); name = "TINA"; collect.Add(name); name = "CRYSTAL"; collect.Add(name); name = "SUZANNE"; collect.Add(name); name = "BEATRICE"; collect.Add(name); name = "KATIE"; collect.Add(name); return collect; } public Girl GetSpecificGirl(string Id) { Girl girl = new Girl { Age = "22", Name ="SUZANNE", Marry = "Single"}; return girl; } } }
 

咱们只是为了,实现WCF服务与客户端通讯,因此简单起见,再也不写复杂的数据访问层代码,不访问数据库,直接hard-code代码,来实现接口。

值得注意的是,.svc文件(Service.svc)。这个文件指明了,实现了WCF服务类的名称与位置。特别是在将WCF服务部署到IIS时,IIS须要.svc文件。以下图:

image

image

 

右击Service.svc,选择在浏览器中查看。看到以下图信息时,说明成功建立了WCF服务。

image

点击上图中两个连接的任意一个,弹出以下图页面:

image

这个页面,显示的是WSDL(Web Service Definition Language)文档,是由WCF 服务生成的元数据文件,描述了WCF服务的相关信息。客户端,就是经过WSDL文档,去与WCF服务通信。能够把WSDL文档,看做是商品使用说明书。(WCF 服务,看做是商品)

以上就是咱们的PracticeService 服务,它提供了两个方法,1.获取全部女孩子信息 2.获取具体某个女孩子信息。服务开发完了,可是还不能被访问。由于须要部署到Internet ,才能够被全世界访问到。接下来,就要部署WCF服务。

 

Deploying WCF Service Into IIS

WCF能够被部署到多种环境中,例如:IIS、 Windows服务、独立的应用程序等。在这里,以IIS为例。

双击PracticeService网站,点击发布web应用程序,以下图:

WeChat Image_20180627214851

选择自定义,在弹出页面,输入PracticeService做为文件名。

image

按照下图序号依次操做。

image

部署后,打开IIS,应能看到以下图所示,WCF 服务部署成功。

image

接下来,就是测试WCF服务了。

 

Building A WCF Client Application

建立一个控制台程序,TestService.双击服务引用,选择添加服务引用。以下图:

image

点击发现,会看到咱们刚才部署的WCF服务。在下面的命名空间,填写PracticeService.

image

测试WCF服务,调用WFC服务。

using System; using TestService.PracticeService; namespace TestService { class Program { static void Main(string[] args) { Console.WriteLine("Press ENTER when the service has started"); Console.ReadLine(); PracticeServiceClient proxy = new PracticeServiceClient(); Console.WriteLine("Test 1: List all Gril's name"); string[] grils=proxy.GetAllGirl(); foreach (string girlsName in grils) { Console.WriteLine("Number: {0}", girlsName); } Console.WriteLine(); Console.WriteLine("Test 2: Display the details of a girl"); Girl girl = proxy.GetSpecificGirl("CHRISTINE"); Console.WriteLine("Number: {0}", girl.Name); Console.WriteLine("Age: {0}", girl.Age); Console.WriteLine("marry: {0}", girl.Marry); Console.WriteLine(); } } }

引用服务引用命名空间,using TestService.PracticeService; 该命名空间包含PracticeServiceClient类(proxy),代理类。代理类至关于客户端到WCF Service之间的翻译官。代理类使客户端对WCF服务的访问,变成相似于对象实例访问方法的形式。代理类将客户端对函数的调用转换成对WCF 服务的访问。wcf服务返回的消息,被代理类转换成对函数的调用。

代理类是如何作到这些的呢?当 WCF服务发布后,会生成WSDL文档,WSDL文档描述了WCF服务的metadata(元数据)。代理类就是经过WSDL来完成翻译工做的!

请注意APP.config文件,以下图:

image

上图中Client标签内的信息,说明了客户端是如何与WCF Service通讯的。在Client的标签内的endpoint(终结点)标签,说明了WCF service的详细信息。其中包括:

address(地址):web service服务部署的地址,以便客户端去访问。

binding(绑定):主要包含web service通讯相关的信息,例如传输机制、传输协议等。binding支持多种传输协议,默认使用BasicHttpBinding,使用http协议通讯。

contract(契约):说明web service提供的服务。

 

WCF AND The Principles of  SOA

到此,咱们已经使用WCF开发了一个webservice服务,只要知道部署webservice服务的地址,世界上任何一台计算机,均可以使用它。咱们前面讲到了,SOA(Service-Oriented  Architecture 面向服务的架构)。SOA的原理,就是将软件功能以服务的形式放在internet上,客户不须要知道实现服务的细节,只要明白这个服务是作什么的,知道服务所在地址,就能够。就像咱们知道一张图片的地址,咱们就能够去访问它。每一个服务都是一个小web service,客户端使用服务,访问web service.由于与web service的访问与网络协议,传输协议等有关,与客户端程序用何种语言开发无关。因此,web service能够被不一样语言开发的客户端程序通讯。

WCF是一个实现SOA程序的平台,使用WCF能够快速开发SOA程序。

相关文章
相关标签/搜索