WCF学习笔记2

WCF的服务部能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程成为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。

WCF服务的寄宿方式:自我寄宿(Self-Hosting)和IIS寄宿两种方式。

一、创建服务契约

  • 服务契约定义一般采用接口的形式进行;
  • 使用System.ServiceModel.ServiceContractAttribute特性应用在接口上,从而将其定义成服务契约;
  • 接口函数上要显示的应用OperationContractAttribute特性,使其成为可访问的服务接口函数;

计算器小例子,如下:

   1:  [ServiceContract(Name="CalculatorService",Namespace="http://www.cnblogs.com/lisgang")]
   2:      public interface ICalculator
   3:      {
   4:          [OperationContract]
   5:          double Add(double x, double y);
   6:          [OperationContract]
   7:          double Subtract(double x, double y);
   8:          [OperationContract]
   9:          double Multiply(double x, double y);
  10:          [OperationContract]
  11:          double Divide(double x, double y);
  12:      }
 

二、创建服务
  • 服务实现服务契约的接口
   1:     public class CalculatorService : ICalculator
   2:      {
   3:          public double Add(double x, double y)
   4:          {
   5:              return x + y;
   6:          }
   7:          public double Subtract(double x, double y)
   8:          {
   9:              return x - y;
  10:          }
  11:          public double Multiply(double x, double y)
  12:          {
  13:              return x * y;
  14:          }
  15:          public double Divide(double x, double y)
  16:          {
  17:              return x / y;
  18:          }
三、通过自我寄宿的方式寄宿服务 
 WCF服务需要一村一个运行着的宿主进程,服务寄宿就是为服务指定一个宿主的过程。WCF采用给予终结点(Endpoint)的通信手段。终结点是由地址(Address)、绑定(Binding)、和契约(Contract)三要素组成,简易记忆方法为:Endpoint=ABC.
地址(Address):地址决定了服务的位置,解决了服务寻址的问题;
绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码、以及它为实现某种功能(比如传输安全、可靠消息传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如:BasicHttpBinding、WSHttpBinding和NetTcpBinding等。
契约(Contract):契约是对服务操作的抽象,也是对消息交换模式及消息结构的定义。
服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境,并为服务添加一个或多个终结点,使之暴露给潜在的服务消费者。
 
在Hosting中加入如下代码:
   1:  static void Main(string[] args)
   2:          {
   3:              using (ServiceHost host=new ServiceHost(typeof(CalculatorService)))
   4:              {
   5:                  host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice");
   6:                  if (host.Description.Behaviors.Find<ServiceMetadataBehavior>()==null)
   7:                  {
   8:                      ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
   9:                      behavior.HttpGetEnabled = true;
  10:                      behavior.HttpGetUrl = new Uri("http://127.0.0.1:3721/calculatorservice/metadata");
  11:                      host.Description.Behaviors.Add(behavior);
  12:                  }
  13:                  host.Opened += delegate
  14:                  {
  15:                      Console.WriteLine("CalculatorService已经启动,按任意键终止服务!");
  16:                  };
  17:                  host.Open();
  18:                  Console.Read();
  19:              }
  20:          }
 WCF服务寄宿通过System.ServiceModel.ServiceHost对象完成。在上面的代码中,基于服务类型(type(CalculatorService))创建了ServiceHost对象,并添加了一个基于WSHttpBinding绑定的终结点。该终结点的地址为:http://127.0.0.1:3721/calculatorservice,并指定了服务契约的类型ICalculator。
WCF服务的描述通过元数据(Metadata)的形式发布出来。WCF中元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior来实现。
 
四、创建客户端调用服务
在客户端通过添加服务引用,将服务引用后,在客户端调用代码。具体如下:
   1:      class Program
   2:      {
   3:          static void Main(string[] args)
   4:          {
   5:              using (CalculatorServiceClient proxy=new CalculatorServiceClient())
   6:              {
   7:                  Console.WriteLine(string.Format("x+y={2} when x={0} and y={1}",1,2,proxy.Add(1,2)));
   8:                  Console.WriteLine(string.Format("x-y={2} when x={0} and y={1}", 1, 2, proxy.Subtract(1, 2)));
   9:                  Console.WriteLine(string.Format("x*y={2} when x={0} and y={1}", 1, 2, proxy.Multiply(1, 2)));
  10:                  Console.WriteLine(string.Format("x/y={2} when x={0} and y={1}", 1, 2, proxy.Divide(1, 2)));
  11:              }
  12:              Console.Read();
  13:          }
  14:      }
运行后的结果,但前提是需要将你的服务宿主Hosting运行起来才可以。
运行结果 
 
 
posted @ 2012-10-15 12:13  KynoLee  阅读(279)  评论(0编辑  收藏  举报