认识Windows Communication Foundation

摘要:
Windows Communication Foundation是一项非常实用且功能强大的技术。此时,进程间通信技术出现了。随着技术的飞速发展,微软相继推出了ComponentObjectModel、Distributed ComponentObjectModel和COM+,。NET框架、远程处理等技术。Web服务是指在服务器上执行的应用程序或组件。WCF是一种用于创建web服务的技术。使用SimpleObjectAccessProtocol协议相互通信。DefinitionContractWCF包括ServiceContract、DataContract、OperationContract和MemberContract。OperationContract:接口中的方法只能在OperationContract属性定义后在外部调用。DataContract:WCF只能将DataContract属性定义的类序列化和反序列化为XMLSchema兼容的数据流。可以看出,只要类需要传输,它就必须具有DataContract。

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

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程序。

免责声明:文章转载自《认识Windows Communication Foundation》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTTP调用接口方法TCHAR数据类型介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

那些说5G“坏话”的人都是怎么想的?

  那些说5G“坏话”的人都是怎么想的?   从5G正式商用至今差不多将近一年时间,但由于5G网络基础设施建设这项工程过于庞大,许多二三线城市用户对5G网络仍然是可望不可即,更不用提广大的乡镇和农村地区。高昂的建设成本从一开始就注定了5G网络普及是个漫长的过程。   姗姗来迟的5G不断消耗着消费者的热情,大量针对5G网络乃至5G技术的争议也随之而来。有人说...

高性能 Windows Socket 组件 HPSocket

高性能 Windows Socket 组件 HP-Socket v2.1.1 正式发布(源代码及测试用例下载) HP-Socket   以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件,组件代号为 HP-Socket。现在把 HP-Socket 的所有代码向大众公开,希望能对大家有所帮助;另外,为了让大家能更方便的学...

Java线程间通信-回调的实现方式

Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的。线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互。   比如举一个简单例子,有一个多线程的类,用来计算文件的MD5码,当多个这样的线程执行的时候,将每个文件的计算的结果反馈给主线程,并从控制台输出。   线程之间的通讯主要靠回调来实现,回调的概念说...

XMPP协议的原理介绍

XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探測。它在促进server之间的准即时操作。这个协议可能终于同意因特网用户向因特网上的其它不论什么人发送即时消息,即使其操作系统和浏览器不同。 XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP眼下被IETF国际标准组织完...

消息队列和管道的区别(转载)

转载自:http://bbs.chinaunix.net/viewthread.php?tid=265266作者:beginner-bj请问管道和消息队列有什么不同 管道通信(PIPE) 管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个 进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信...

FreeRTOS-Qemu 实现三任务同步通信机制以及API信息

1. 本次作业的考察要点: 作业地址:github.com/HustWolfzzb…Git/GCC/GDB/QEMU等工具的使用。FreeRTOS多任务同步和通信机制的掌握。 2. 编程作业: 在github上,Fork例程项目(github.com/cbhust/STM3… 到自己的个人账号。clone项目到本地电脑的Ubuntu虚拟机中(虚拟机环...