专栏首页大内老A[WCF REST] WebServiceHost有何特别之处?

[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: }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《深入理解C# 3.x的新特性》博文系列汇总

    较之C# 2.0, C# 3.x引入了一系列新的特性,为我们编程带来很大的便利,通过有效地利用这些新特性,我们可以编写出更加简洁、优雅的程序。不过这些新特性仅仅...

    蒋金楠
  • [WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活

    今天介绍WCF 4.0的另外两个新特性:标准终结点(Standard Endpoint)和无(.SVC)文件服务激活(File-Less Activation)...

    蒋金楠
  • 通过扩展让ASP.NET Web API支持W3C的CORS规范

    让ASP.NET Web API支持JSONP和W3C的CORS规范是解决“跨域资源共享”的两种途径,在《通过扩展让ASP.NET Web API支持JSONP...

    蒋金楠
  • 微信小程序修改checkbox组件默认样式

    w候人兮猗
  • 使用python上传和下载文件到Fast

    3. 新建测试文件test_fdfs.py,把下载解压后安装包的.../FastDFS/conf/client.conf文件复制到/etc/fdfs下:

    py3study
  • 编程小知识之时间显示

    开发中总会在各种场景下遇到需要显示时间的情况,显示的格式要求又往往五花八门,正常的譬如: “2018年12月29日20点30分15秒”, 简洁一些的则有: “2...

    用户2615200
  • 日本学者神研究:追剧学英语两不误,眼动数据分析为你定制专属字幕

    但是,这样“学习”的过程可谓十分煎熬了,常常是关了字幕练听力,一会就睡着了;而全部打开字幕的话,我的眼里就只有中文了。一部剧看下来,既没有学到几个单词,还牺牲了...

    大数据文摘
  • 安卓7.0及以上抓包证书小技巧

    安卓7.0开始以及以上抓包的时候都要处理一下证书。改apk包、在电脑上 上输入下面命令。

    吾爱小白
  • 图像特征点|Moravec特征点

    小白好久没有写文章了,近期的事情比较多,公众号的好多事情都是由师弟们在处理,今天终于抽出点时间可以和小伙伴们共同学习。本次为小伙伴们带来的是图像特征专题,Mor...

    小白学视觉
  • 在ABAP Webdynpro里显示PDF的一种办法

    There is a good blog about how to get PDF preview in CRM web client UI. However ...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券