[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)))
25: Console.WriteLine("\t{0, -20}: {1}", "HttpHelpPageEnabled", serviceDebug.HttpHelpPageEnabled);
26: Console.WriteLine("\t{0, -20}: {1}\n", "HttpsHelpPageEnabled", serviceDebug.HttpsHelpPageEnabled);
29: Console.WriteLine("\t{0, -20}: {1}", "HttpGetEnabled", serviceMetadata.HttpGetEnabled);
30: Console.WriteLine("\t{0, -20}: {1}", "HttpsGetEnabled", serviceMetadata.HttpsGetEnabled);
在如上所示的代码片断中,我们分别将服务行为ServiceDebugBehavior和ServiceMetadataBehavior应用在寄宿服务上,并将其HttpHelpPageEnabled/HttpsHelpPageEnabled和HttpGetEnabled/HttpsGetEnabled属性设置为True。在开启WebServiceHost之后我们将两个服务行为的这4个属性打印出来。从如下所示的输出结果我们可以看出这四个属性最终被设置成了False。
二、添加标准终结点
终结点是由地址、绑定和契约三要素构成,所谓标准终结点,就是基于典型的通信场景选择组成终结点的要素(主要是绑定和契约)进而创建出一个标准的终结点。如果我们在使用WebServiceHost进行服务寄宿的时候指定一个基地址,在没有添加任何终结点的情况下WebServiceHost会在开启过程中自动添加一个类型(Kind)为webHttpEndpoint 的标准终结点。我们同样可以通过实例演示来证实这一点。
9: Console.WriteLine("{0,-8}: {1}", "Contract", endpoinit.Contract.ContractType);
在没有提供任何配置的情况下,我们通过如上的代码借助于WebServiceHost进行服务寄宿。在基于服务类型创建的WebServiceHost中指定了一个基地址,并在开启WebServiceHost之后,我们获取第一个终结点并将其三要素打印出来。从如下所示的输出结果我们可以看出:WebServiceHost基于服务类型实现的契约接口IEmployees创建了一个终结点,该终结点采用指定的基地址作为其地址,绑定类型为WebHttpBinding。
三、添加WebHttpBehavior终结点行为
正如上面所说,WebServiceHost除了完成从ServiceHost继承下来的服务寄宿功能之外,其只要的职责就是将WebHttpBehavior行为应用到寄宿服务的所有终结点上。也就是说,当我们开启WebServiceHost的时候,如果终结点没有应用WebHttpBehavior行为,会自动创建一个新的WebHttpBehavior对象应用到终结点上。WebHttpBehavior的自动添加可以通过如下代码中的调试断言来体现。
1: using (WebServiceHost host = new WebServiceHost(typeof(EmployeesService)))
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 原文链接
(纯代码)快速创建wcf rest 服务 因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBinding
相关文章
- jQuery.Ajax()执行WCF Service的方法
- yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[下篇]
- [WCF-Discovery]让服务自动发送上/下线通知[原理篇]
- [WCF 4.0新特性] 路由服务[原理篇]
- 通过“四大行为”对WCF的扩展[实例篇]
- 并发中的同步--WCF并发体系的同步机制实现
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)
- 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析