认识Windows Communication Foundation

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

Windows Communication Foundation   是一种非常实用、非常强大的技术。属于.NET范畴内的,微软推出的技术。在这个.NET即将失去市场的日子里,也只有WCF这个技术还有点价值,还可以得到市场的认可。为了提升自己的价值,要好好学习一些实用、值钱的技术。

                                                          

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 等技术。这些技术,都是为了实现应用程序与组件之间相互通信的。

     既然有这么多技术来支持应用程序与组件之间通信,那为什么还需要推出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服务。

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

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

WeChat Image_20180626220732_副本

三、创建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程序。

 

posted @ 2018-06-28 21:04  VitoCorleone  阅读(1073)  评论(0编辑  收藏  举报