好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WCF技术剖析

WCF技术剖析

WCF技术剖析_学习笔记之一

本系列适合新手,从0学起。共同学习,共同探讨。

基础概念

SOA:就是采用Web服务的架构

它有一些特性,需要了解:

1、自治的:不依赖于访问它的客户端和其他服务,可以独立的进行部署和实施版本策略和安全策略。

2、依赖于开放的标准:让不同的厂商开发的服务能够进行互操作。

3、支持跨平台

4、鼓励创建可组合的服务

5、鼓励服务的复用

6、强调松耦合:契约的实现

WCF应用实例,帮助理解WCF服务的基本结构

过程:

1、构建解决方案

Contracts:定义服务的契约(接口部分)

Services:定义服务的实现(具体逻辑实现)

Hostiing:宿主

另外还有一个是客户端,位于独立的解决方案中

Client

具体如下图所示:

2、创建服务契约

wcf包含四种契约:服务契约,数据契约,消息契约和错误契约。这里介绍第一种。

服务契约

 using   System;
  using  System.ServiceModel; //  WCF框架的绝大部分实现和API定义在该程序集中 

 namespace   YH.WCFServices.Contracts
{
      ///   <summary> 
     ///   定义服务契约
      ///   </summary> 
    [ServiceContract(Name= "  CalculatorBervice  " ,Namespace= "  http://www.aoyou.com/  " )] //  作用是显式的声明该接口为服务契约 
     public   interface   ICalculator
    {
          //  成员方法并不能自动成为服务的操作,需要显示应用特性 
         [OperationContract]
          double  Add( double  x,  double   y);

        [OperationContract]
          double  Subtract( double  x,  double   y);
    }
} 

3、实现服务

服务的具体实现

 using   System;
  using   YH.WCFServices.Contracts;

  namespace   YH.WCFServices.Services
{
      ///   <summary> 
     ///   服务的实现
      ///   </summary> 
     public   class   CalculatorService:ICalculator
    {
          public    double  Add( double  x,  double   y)
        {
              return  x +  y;
        }
          public   double  Subtract( double  x,  double   y)
        {
              return  x -  y;
        }
    }
} 

4、寄宿
(1)编码方式自我寄宿

自我寄宿

 using   System;
  using   System.ServiceModel;
  using   System.ServiceModel.Description;
  using   YH.WCFServices.Contracts;
  using   YH.WCFServices.Services;

  namespace   YCH.WCFServices.Hostiing
{
      class   Program
    {
          static   void  Main( string  [] args)
        {
              //  提供服务寄宿的主机ServiceHost 
             using  (ServiceHost host =  new  ServiceHost( typeof  (CalculatorService)))
            {
                  //  终结点=ABC【地址、绑定、契约】
                  //  地址:决定服务的地址、解决服务的寻址问题
                  //  绑定:绑定实现了通信的所有细节,包括网络传输、消息编码、以及其他为实现某种功能(比如安全、可靠传输、事务等,对消息进行的相应处理)
                  //  提供的系统定义绑定:BasicHttpBinding、WsHttpBinding、NetTcpBinding等
                  //  契约:对服务操作的抽象、也是对消息交换模式和消息结构的定义 
                host.AddServiceEndpoint( typeof (ICalculator),  new  WSHttpBinding(),  "  http://127.0.0.1:9999/calculatorservice/metadata  "  );
                  if  (host.Description.Behaviors.Find<ServiceMetadataBehavior>() ==  null  )
                {
                      //  元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior来实现 
                    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();
            }
        }
    }
} 

WCF服务寄宿通过ServiceHost对象完成。请注意构造函数参数,是基于服务的类型(而不是契约的类型)
if块里面的可省略。这里定义的是服务的描述,这里面代码作用是:因为实现了松耦合,WCF应用中,客户端只需了解WCF服务的基本描述,无需知道具体实现细节。

描述是通过元数据形式发布的。这个通过ServiceMetadataBehavior来实现。这里采用了HTTP-GET的元数据获取方式,发布地址通过HttpGetUrl指定。

获取相关元数据,可以在浏览器中键入 http://127.0.0.1:9999/calculatorservice/metadata ,以WSDL形式展示。

ServiceHost的Open方法对服务成功寄宿。

(2)配置文件方式自我寄宿

 VS的工具里提供【WCF服务配置编辑器】,有向导,可以尝试下。

如果生成了配置文件,就可以直接读取之。

寄宿服务代码

 using  (ServiceHost host =  new  ServiceHost( typeof  (CalculatorService)))
            {
                host.Opened  +=  delegate  
                {
                    Console.WriteLine(  "  CalculatorService已启动  "  );
                };
                host.Open();
                Console.Read();
            } 

以上,其实也就是省略了指定终结点信息(ABC)的过程。

5、可以创建客户端调用服务了

这个主要是在VS中操作,添加服务,VS会自动生成一系列用于服务调用的代码和配置。

代码:

Client代码

 using   System;
  using   WCFModel_1.CalculatorService;

  namespace   WCFModel_1
{
      class   Program
    {
          static   void  Main( string  [] args)
        {
            CalculatorBerviceClient client  =  new   CalculatorBerviceClient();
            client.Add(  2 ,  3  );
        }
    }
} 

客户端通过服务代理对象进行服务的调用。即通过创建自动生成的、继承自ClientBase<T>的类型对象进行服务调用的。

6、通过IIS寄宿服务

(1)为服务创建.svc文件

.svc文件,是一个文本文件,仅仅包含一个ServiceHost指令,该指令鱼油一个必须的Service属性(指明了相应的WCF服务的有效类型)和一些可选的属性。

(2)为WCF服务创建虚拟目录

这个书上并未讲怎么生成.svc文件,所以导致实验不能继续。待研究明白后继续补充。

 

 

分类:  C#课堂 ,  WCF ,  随笔

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于WCF技术剖析的详细内容...

  阅读:32次

上一篇: WebKit

下一篇:Backbone.js