一起学WCF【3】

来源:互联网 发布:苹果怎么清理淘宝缓存 编辑:程序博客网 时间:2024/05/01 11:50

WCF使用契约的概念将服务和服务的操作定义为一个整体,解释通过网络传递的数据。有时还要定义客户端与服务之间交换的SOAP信息。WCF使用WSDL和XSD来发送服务元数据。

WCF有三种契约:服务契约、数据契约和消息契约。每类契约都定义了一种行为。使用哪一种契约取决于系统架构。最常用的契约类型是服务契约,即终结点A、B、C三要素的C。服务终结点是一个可寻址的单元,客户端利用它来发送和接收消息。

在SOA架构中,契约提供了服务通信所必需的元数据。契约用来定义数据类型、操作、消息交换模式和消息交换使用的传输协议。在WCF中,服务元数据通常是用WSDL(WEB服务描述)文档格式描述的。

服务契约定义了服务向外界公开的功能,表现为服务操作。在SOA中,需要交换一组SOAP消息,它们的模式通常在服务契约中定义。服务契约也可进一步定义每个服务操作的消息交换模式(请求-响应模式、单工模式、双工模式)。

数据契约定义了客户端与服务之间信息交换的结构和内容。传给服务或由服务返回的消息参数在数据契约中被解释为XSD Schema,它是WSDL的一部分。

自定义对象或复杂数据类型作为服务操作的参数或返回值,则须向运行时提供信息,告之如何用数据契约特性把这些类型序列化为XML流。参数如果使用简单的.NET类型,则无须考虑序列化与反序列化的问题。

消息契约可对SOAP头和SOAP体进行控制。

 

WCF为建立WSDL元数据文档提供了工具、特性和类。

使用WCF开发SOA架构,可使用基于代码的方法,也可用.  NET特性、配置参数及WCF提供的API来控制元数据文档的生成。

知道WSDL部分与元数据之间的对应关系是需要掌握的。

 

为了对WCF有一个直观的印象,请看如下例子:

本例具有一个WCF应用的基本结构,我们将实现一个简单的计算服务。客户端和服务端通过运行在同一机器上的不同程序来模拟。

WCF服务不能孤立的存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,服务寄宿于宿主的过程叫服务寄宿,有自我寄宿和IIS寄宿两种方式。

 

构建一个空解决方案“WcfSerivce”,并添加如下4个项目。

Service.Interface:用于定义服务契约的类库项目

Service:用于定义服务类型的类库项目,实现在Service.Interface中相应的契约接口。

Hosting:服务宿主的控制台应用。

Client:一个控制台应用模拟服务的客户端。

 

创建服务契约:

从功能上讲,服务契约抽象了服务提供的所有操作;从消息交换的角度看,服务契约则定义了基于服务调用消息交换过程中请求消息和回复消息的结构及采用的消息交换模式,我们一般将服务契约定义成接口。

将System.ServiceModel.ServiceContractAtrribute特性应用在接口ICalculator上形成服务契约,同时可以指定服务契约的名称和命名空间:

在Service.Interface的接口ICalculator中添加:

using System.ServiceModel;

namespace Service.Interface

{

   [ServiceContract(Name = "CalculatorService", Namespace="http://www.artech.com/")]

    publicinterface ICalculator

    {

       [OperationContract]

        doubleAdd(double x, double y);

       [OperationContract]

        doubleSubtract(double x, double y);

       [OperationContract]

        doubleMultiply(double x, double y);

       [OperationContract]

        doubleDivide(double x, double y);

    }

}

 

创建服务

之后我们在Service项目中实现接口,类名CalculatorService,实现接口中的4个方法。代码如下:

using Service.Interface;

 

namespace Service

{

    publicclass CalculatorService : ICalculator

    {

        publicdouble Add(double x, double y)

        {

           return x + y;

        }

 

        publicdouble Subtract(double x, double y)

        {

           return x - y;

        }

        publicdouble Multiply(double x, double y)

        {

           return x * y;

        }

        publicdouble Divide(double x, double y)

        {

           return x / y;

        }

    }

}

 

通过自我寄宿的方式寄宿服务

WCF服务需要一个运行着的宿主进程,它采用基于终结点的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。

一个终结点包含了通信所必需的所有信息。

地址:决定了服务的位置。

绑定:实现了通信的所有细节,包括网络传输、消息编码,以及其他(如传输安全、可靠消息传输、事务等)对消息进行的相应处理。WCF中有一系列系统定义的绑定,比如BasicHttpBinding、WSHttpBinding和NetTcpBinding等。

契约:契约是服务操作的抽象,也是对消息交换模式及消息结构的定义。

在Hosting项目中,添加如下代码将CalculatorService寄宿于控制台程序中。

using System;

using System.ServiceModel;

using System.ServiceModel.Description;

using Artech.WcfServices.Service;

using Artech.WcfServices.Service.Interface;

namespace Artech.WcfServices.Hosting

{

    classProgram

    {

        staticvoid Main(string[] args)

        {

           using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))

            {

               host.AddServiceEndpoint(typeof(ICalculator), newWSHttpBinding(),"http://127.0.0.1:3721/calculatorservice");

               if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() ==null)

               {

                   ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();

                   behavior.HttpGetEnabled = true;

                   behavior.HttpGetUrl = newUri("http://127.0.0.1:3721/calculatorservice/metadata");

                   host.Description.Behaviors.Add(behavior);

               }

               host.Opened += delegate

               {

                   Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");

               };

 

               host.Open();

               Console.Read();

            }

        }

    }

}

服务寄宿通过System.ServiceModel.ServiceHost对象完成。上述代码我们基于服务类型创建了ServiceHost对象,添加了一个基于WSHttpBinding绑定的终结点。

WCF服务的描述通过元数据的形式发布出来,元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior来实现。

在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:3721/calculatorservice/metadata"/>

       </behavior>

     </serviceBehaviors>

      </behaviors>

   <services>

     <service name="Service.CalculatorService"

              behaviorConfiguration="metadataBehavior">

       <endpoint address="http://127.0.0.1:3721/calculatorservice"

                 binding="wsHttpBinding"

                  contract="Service.Interface.ICalculator"/>

     </service>

   </services>

 </system.serviceModel>

</configuration>

在VS的工具– WCF服务配置编辑器中,使用该工具可以简化写配置文件的操作。

采用配置后,寄宿代码得到精简,如下:

using (ServiceHost host = newServiceHost(typeof(CalculatorService)))

            {

               host.Opened += delegate

               {

                   Console.WriteLine("CalculatorService已经启动,按任意键终止服务!");

               };

 

               host.Open();

               Console.Read();

            }

原创粉丝点击