• [WCF REST] WebServiceHost有何特别之处?


    WCF为REST服务的寄宿提供了一个新的ServiceHost,即WebServiceHost。WebServiceHost是ServiceHost的子类,而WebServiceHostFactory是对应的ServiceHostFactory,在基于IIS/WAS寄宿中被使用。由于对REST服务绝大部分功能的支持都是通过WebHttpBehavior这么一个终结点行为实现的,所以WebServiceHost的核心功能就是将该终结点行为应用到寄宿服务的所有终结点。除此之外,WebServiceHost还具有一些额外的功能,这些功能都是通过重写OnOpening方法实现的。

    一、ServiceDebugBehavior与ServiceMetadataBehavior

    由于WebHttpBehavior提供了帮助页面,所以当我们通过WebServiceHost对REST服务进行寄宿的时候会屏蔽掉通过ServiceDebugBehavior服务行为提供的帮助页面。由于通过服务行为ServiceMetadataBehavior实现的元数据发布机制是基于SOAP的,如果我们在寄宿服务上应用了ServiceMetadataBehavior行为,WebServiceHost也会将基于HTTP-GET的元数据发布功能屏蔽。我们可以通过一个简单的实例来证实这一点。

       1: using (WebServiceHost host = new WebServiceHost(typeof(EmployeesService)))
       2: {
       3:     ServiceDebugBehavior serviceDebug = 
       4:     host.Description.Behaviors.Find<ServiceDebugBehavior>();
       5:     if (null == serviceDebug)
       6:     {
       7:         serviceDebug = new ServiceDebugBehavior();
       8:         host.Description.Behaviors.Add(serviceDebug);
       9:     }
      10:     serviceDebug.HttpHelpPageEnabled = true;
      11:     serviceDebug.HttpsHelpPageEnabled = true;
      12:  
      13:     ServiceMetadataBehavior serviceMetadata = 
      14:     host.Description.Behaviors.Find<ServiceMetadataBehavior>();
      15:     if (null == serviceMetadata)
      16:     {
      17:         serviceMetadata = new ServiceMetadataBehavior();
      18:         host.Description.Behaviors.Add(serviceMetadata);
      19:     }
      20:     serviceMetadata.HttpGetEnabled = true;
      21:     serviceMetadata.HttpsGetEnabled = true;
      22:     host.Open();
      23:  
      24:     Console.WriteLine("ServiceDebugBehavior");
      25:     Console.WriteLine("\t{0, -20}: {1}", "HttpHelpPageEnabled", serviceDebug.HttpHelpPageEnabled);
      26:     Console.WriteLine("\t{0, -20}: {1}\n", "HttpsHelpPageEnabled", serviceDebug.HttpsHelpPageEnabled);
      27:  
      28:     Console.WriteLine("ServiceMetadataBehavior");
      29:     Console.WriteLine("\t{0, -20}: {1}", "HttpGetEnabled", serviceMetadata.HttpGetEnabled);
      30:     Console.WriteLine("\t{0, -20}: {1}", "HttpsGetEnabled", serviceMetadata.HttpsGetEnabled);
      31: }

    在如上所示的代码片断中,我们分别将服务行为ServiceDebugBehavior和ServiceMetadataBehavior应用在寄宿服务上,并将其HttpHelpPageEnabled/HttpsHelpPageEnabled和HttpGetEnabled/HttpsGetEnabled属性设置为True。在开启WebServiceHost之后我们将两个服务行为的这4个属性打印出来。从如下所示的输出结果我们可以看出这四个属性最终被设置成了False。

       1: ServiceDebugBehavior
       2:     HttpHelpPageEnabled : False
       3:     HttpsHelpPageEnabled: False
       4:  
       5: ServiceMetadataBehavior
       6:     HttpGetEnabled      : False
       7:     HttpsGetEnabled     : False

    二、添加标准终结点

    终结点是由地址、绑定和契约三要素构成,所谓标准终结点,就是基于典型的通信场景选择组成终结点的要素(主要是绑定和契约)进而创建出一个标准的终结点。如果我们在使用WebServiceHost进行服务寄宿的时候指定一个基地址,在没有添加任何终结点的情况下WebServiceHost会在开启过程中自动添加一个类型(Kind)为webHttpEndpoint 的标准终结点。我们同样可以通过实例演示来证实这一点。

       1: Uri baseAddress = new Uri("http://127.0.0.1:3721/employees");
       2: using (WebServiceHost host = 
       3:     new WebServiceHost(typeof(EmployeesService), baseAddress))
       4: {
       5:     host.Open();
       6:     ServiceEndpoint endpoinit = host.Description.Endpoints[0];
       7:     Console.WriteLine("{0,-8}: {1}", "Address", endpoinit.Address);
       8:     Console.WriteLine("{0,-8}: {1}", "Binding", endpoinit.Binding);
       9:     Console.WriteLine("{0,-8}: {1}", "Contract", endpoinit.Contract.ContractType);
      10: }

    在没有提供任何配置的情况下,我们通过如上的代码借助于WebServiceHost进行服务寄宿。在基于服务类型创建的WebServiceHost中指定了一个基地址,并在开启WebServiceHost之后,我们获取第一个终结点并将其三要素打印出来。从如下所示的输出结果我们可以看出:WebServiceHost基于服务类型实现的契约接口IEmployees创建了一个终结点,该终结点采用指定的基地址作为其地址,绑定类型为WebHttpBinding。

       1: Address : http://127.0.0.1:3721/employees
       2: Binding : System.ServiceModel.WebHttpBinding
       3: Contract: Artech.WcfServices.Service.Interface.IEmployees

    三、添加WebHttpBehavior终结点行为

    正如上面所说,WebServiceHost除了完成从ServiceHost继承下来的服务寄宿功能之外,其只要的职责就是将WebHttpBehavior行为应用到寄宿服务的所有终结点上。也就是说,当我们开启WebServiceHost的时候,如果终结点没有应用WebHttpBehavior行为,会自动创建一个新的WebHttpBehavior对象应用到终结点上。WebHttpBehavior的自动添加可以通过如下代码中的调试断言来体现。

       1: using (WebServiceHost host = new WebServiceHost(typeof(EmployeesService)))
       2: {
       3:     foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
       4:     {
       5:         WebHttpBehavior behavior = endpoint.Behaviors.Find<WebHttpBehavior>();
       6:         if (null != behavior)
       7:         {
       8:             endpoint.Behaviors.Remove(behavior);
       9:         }
      10:     }        
      11:     host.Open();
      12:     foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
      13:     {
      14:         Debug.Assert(null != endpoint.Behaviors.Find<WebHttpBehavior>());
      15:     }      
      16: }
  • 相关阅读:
    YARN源码学习(七)-----Task级别GC相关指标的自定义counter添加
    YARN源码学习(七)-----Task级别GC相关指标的自定义counter添加
    YARN源码分析(八)-----Reduce Shuffle过程分析
    YARN源码分析(八)-----Reduce Shuffle过程分析
    【每天一道算法题】整数循环节之和——数字黑洞6174
    getline函数
    设计模式之建造者模式Builder(创建型)
    字符串算法总结
    C++设计模式之单例模式
    Linux下C的线程同步机制
  • 原文地址:https://www.cnblogs.com/artech/p/WebServiceHost.html
Copyright © 2020-2023  润新知