Windows Communication Foundation(WCF)

来源:互联网 发布:教师网络培训心得体会 编辑:程序博客网 时间:2024/05/24 06:31

无废话WCF入门教程一[什么是WCF]

我的WCF之旅(1):创建一个简单的WCF程序

WCF学习笔记——WCF基础

和传统的分布式通信框架一样,WCF本质上提供一个跨进程、跨机器以致跨网络的服务调用。

WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。在我们的计算服务应用中,采用了两种服务寄宿方式:通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主(寄宿进程为Hosting.exe);通过IIS寄宿方式将服务寄宿于IIS中(寄宿进程为IIS的工作进行W3wp.exe)。客户端通过另一个控制台应用模拟(进程为Client.exe)。接下来,我们就一步一步来构建这样的一个WCF应用。


WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。[启动WCF服务,处于运行中,才能使用] 在我们的计算服务应用中,采用了两种服务寄宿方式:通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主(寄宿进程为Hosting.exe);通过IIS寄宿方式将服务寄宿于IIS中(寄宿进程为IIS的工作进行W3wp.exe)。客户端通过另一个控制台应用模拟(进程为Client.exe)。接下来,我们就一步一步来构建这样的一个WCF应用。

步骤一:构建整个解决方案

通过VS 2008创建一个空白的解决方案,添加如下四个项目。项目的类型、承载的功能和相互引用关系如下,整个项目在VS下的结构如图2所示。

  • Contracts:一个类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(WCF框架的绝大部分实现和API定义在该程序集中);
  • Services:一个类库项目,提供对WCF服务的实现。定义在该项目中的所有WCF服务实现了定义在Contracts中相应的服务契约,所以Services具有对Contracts项目的引用;
  • Hosting:一个控制台(Console)应用,实现对定义在Services项目中的服务的寄宿,该项目须要同时引用Contracts和Services两个项目和System.ServiceMode程序集;
  • Client:一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。

图2 计算服务在VS中的结构

步骤二:创建服务契约

WCF采用基于契约的交互方式实现了服务的自治,以及客户端和服务端之间的松耦合。WCF包含四种类型的契约:服务契约、数据契约、消息契约和错误契约,这里着重于服务契约。从功能上讲,服务契约抽象了服务提供的所有操作;而站在消息交换的角度来看,服务契约则定义了基于服务调用的消息交换过程中,请求消息和回复消息的结构,以及采用的消息交换模式。第4章将提供对服务契约的详细介绍。

一般地,我们通过接口的形式定义服务契约。通过下面的代码,将一个接口ICalculator定义成服务契约。WCF广泛采用基于自定义特性(Custom Attribtue)的声明式编程模式,我们通过在接口上应用System.ServiceModel.ServiceContractAttribute特性将一个接口定义成服务契约。在应用ServiceContractAttribute特性的同时,还可以指定服务契约的名称和命名空间。至于契约名称和命名空间的含义和作用,在本人拙著《WCF技术剖析(卷1)》第4章,在这里我们将契约名称和命名空间设置成CalculatorService和http://www.artech.com/)。

通过应用ServiceContractAttribute特性将接口定义成服务契约之后,接口的方法成员并不能自动成为服务的操作。在此方面,WCF采用的是显式选择(Explicit Opt-in)的策略:我们须要在相应的操作方法上面显式地应用OperationContractAttribute特性。

using System.ServiceModel;namespace Artech.WcfServices.Contracts {     [ServiceContract(Name="CalculatorService", Namespace="http://www.artech.com/")]     public interface ICalculator     {         [OperationContract]        double Add(double x, double y);          [OperationContract]         double Subtract(double x, double y);          [OperationContract]        double Multiply(double x, double y);         [OperationContract]          double Divide(double x, double y);             }    }

步骤三:创建服务

当服务契约成功创建时,我们需要通过实现服务契约来创建具体的WCF服务。WCF服务CalculatorService定义在Services项目中,实现了服务契约接口ICalculator,实现了所有的服务操作。CalculatorService定义如下:

namespace Artech.WcfServices.Services {public class CalculatorService:ICalculator{        public double Add(double x, double y)        {            return x + y;        }         public double Subtract(double x, double y)         {             return x - y;        }          public double Multiply(double x, double y)        {             return x * y;         }        public double Divide(double x, double y)         {             return x / y;         }     }}

步骤四:通过自我寄宿的方式寄宿服务

WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成,如图3所示。由于三要素应为首字母分别为ABC,所以就有了易于记忆的公式:Endpoint = ABC。一个终结包含了实现通信所必需的所有信息,我们可以这样认识终结点的ABC:

  • 地址(Address):地址决定了服务的位置,解决了服务寻址的问题,《WCF技术剖析(卷1)》第2章提供了对地址和寻址机制的详细介绍;
  • 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等,《WCF技术剖析(卷1)》第3章提供对绑定的详细介绍;
  • 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。《WCF技术剖析(卷1)》第4章提供对服务契约的详细介绍。

 

图3 终结点三要素

服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或多个终结点,使之暴露给潜在的服务消费者。服务消费者最终通过相匹配的终结点对该服务进行调用。我们可以完全通过代码的方式完成所有的服务寄宿工作,下面的代码体现了通过一个控制台应用对CalculatorService的寄宿:

using Artech.WcfServices.Contracts;using System;   using System.ServiceModel;   using System.ServiceModel.Description;   using Artech.WcfServices.Contracts;   using Artech.WcfServices.Services;   namespace Artech.WcfServices.Hosting   {       class Program       {           static void Main(string[] args)           {               using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))               {                   host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:9999/calculatorservice");                   if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)                   {                       ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();                       behavior.HttpGetEnabled = true;                       behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/calculatorservice/metadata");                       host.Description.Behaviors.Add(behavior);                   }                   host.Opened += delegate                   {                       Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");                   };                   host.Open();                   Console.Read();               }           }       }   }

快速将代码每一行前面的行序号删除
按住ALT键不放,可用鼠标勾划自定义选区,然后Delete。

WCF服务寄宿通过一个特殊的对象完成:ServiceHost。在上面的例子中,基于WCF服务的类型(typeof(CalculatorService))创建了ServieHost对象,并添加了一个终结点。具体的地址为http://127.0.0.1:9999/calculatorservice,采用了WSHttpBinding,并指定了服务契约的类型ICalculator。

松耦合是SOA的一个基本的特征,WCF应用中客户端和服务端的松耦合体现在客户端只须要了解WCF服务基本的描述,而无须知道具体的实现细节,就可以实现正常的服务调用。WCF服务的描述通过元数据(Metadata)的形式发布出来。WCF中元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior实现。在上面提供的服务寄宿代码中,我们为创建的ServiceHost添加了ServiceMetadataBehavior,并采用了基于HTTP-GET的元数据获取方式,元数据的发布地址通过ServiceMetadataBehavior的HttpGetUrl指定。在调用ServiceHost的Open方法对服务成功寄宿后,我们可以通过该地址获取服务相关的元数据。在IE地址栏上键入http://127.0.0.1:9999/calculatorservice/metadata,你将会得到以WSDL形式体现的服务元数据,如图4所示。

图4 通过HTTP-GET的方式获取WCF服务的元数据

在进行真正的WCF应用开发时,一般不会直接通过编码的方式进行终结点的添加和服务行为的定义,而是通过配置的方式进行。上面添加终结点和定义服务行为的代码可以用下面的配置代替:

<?xml version="1.0" encoding="utf-8" ?>   <configuration>       <system.serviceModel>           <behaviors>               <serviceBehaviors>                   <behavior name="metadataBehavior">                       <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:9999/calculatorservice/metadata" />                   </behavior>               </serviceBehaviors>          </behaviors>          <services>              <service behaviorConfiguration="metadataBehavior" name="Artech.WcfServices.Services.CalculatorService">                  <endpoint address="http://127.0.0.1:9999/calculatorservice" binding="wsHttpBinding"  
contract="Artech.WcfServices.Contracts.ICalculator" />              </service>          </services>      </system.serviceModel>  </configuration>

对于初学者来说,WCF的配置显得过于复杂,直接对配置文件进行手工编辑不太现实。在这种情况下,可以直接使用VS提供的配置工具。你可以通过VS的工具(Tools)菜单,选择“WCF Service Configuration Editor”子项,开启这样的一个配置编辑器,如图5所示。

如果采用了上诉的配置,服务寄宿代码将会得到极大的精简,只需包含下面几行代码:

namespace Artech.WcfServices.Hosting{    class Program    {        static void Main(string[] args)        {            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))            {                                host.Opened += delegate                 {                     Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");                 };                   host.Open();                 Console.Read();             }         }     } }

图5 如何获得WCF服务配置编辑器

WCF入门

0 0
原创粉丝点击