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

今天介绍WCF 4.0的另外两个新特性:标准终结点(Standard
Endpoint)和无(.SVC)文件服务激活(File-Less
Activation)。前者实现了针对典型通信场景对终结点的定制,后者让你在进行IIS/WAS的服务寄宿中无须定义.svc文件。

一、标准终结点

我们知道,绑定的本质就是一系列相关绑定元素的有序集合,而系统绑定就是基于若干典型的通信场景对相关绑定元素的整合。WCF通过系统绑定对绑定元素进行了定制,那么能否在终结点级别对组成该终结点的ABC(地址、绑定和契约)也进行相应的定制呢?实际上这对于最新版本的WCF是可行的,我们将这个机制称为“标准终结点”。

所谓标准终结点,就是针对典型的通信场景选择组成终结点的要素(主要是绑定和契约)进而创建出一个标准的终结点。在使用的时候,如果你需要的终结点要素和标准终结点完全一致,就无需进行重复的设置;如果不一致,则只需要单独对此进行重新设置以覆盖定义在标准终结点的默认设置。

比如说,对于用于发布元数据的终结点总是将IMetadataExchange作为其契约,并且在大部分情况下使用MexHttpBinding。如果我们基于这两个元素创建一个标准的MexEndpoint,那么在为服务配置发布元数据的终结点的时候就只需要指定地址就可以了。实际上,WCF确实为我们创建了这么一个标准的MexEndpoint终结点。包含MexEndpoint终结点在内,WCF总共为我们定义了如下面的列表所示的9个标准终结点。

  • mexEndpoint:用于公开服务元数据的标准终结点;
  • dynamicEndpoint:使用 WS-Discovery 在运行时动态查找终结点地址的标准终结点;
  • discoveryEndpoint:由服务用于发送发现消息的标准终结点;
  • udpDiscoveryEndpoint:通过 UDP 多播绑定为发现操作预配的标准终结点;
  • announcementEndpoint:由服务用于发送公告消息的标准终结点;
  • udpAnnouncementEndpoint:由服务用于通过 UDP 绑定发送公告消息的标准终结点;
  • workflowControlEndpoint:可用于对工作流实例调用控制操作的标准终结点;
  • webHttpEndpoint:带有自动添加 WebHttpBehavior行为的WebHttpBinding绑定的标准终结点;
  • webScriptEndpoint:带有自动添加 WebScriptEnablingBehavior行为的WebHttpBinding绑定的标准终结点。

如果你希望直接为某个服务配置一个标准终结点,可以借助于WCF4.0为终结点的配置节添加的一个新的配置属性kind,该属性表示标准终结点名称。在上面的配置中,我为服务配置了一个标准终结点mexEndpoint以实现基于MEX终结点形式的元数据发布。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <system.serviceModel>
   4:     ...
   5:     <services>      
   6:       <service name="Artech.WcfServices.Service.CalculatorService" >
   7:         <host>
   8:           <baseAddresses>
   9:             <add baseAddress="http://127.0.0.1:3721/calculatorservice"/>
  10:           </baseAddresses>
  11:         </host>
  12:         <endpoint binding="ws2007HttpBinding" contract="Artech.WcfServices.Contract.ICalculator" />
  13:         <endpoint kind="mexEndpoint" address="mex"/>
  14:       </service>
  15:     </services>  
  16:   </system.serviceModel>
  17: </configuration>

对于系统绑定来说,WCF允许你通过配置的方式对其进行定制,标准终结点也不例外。如果标准的终结点默认配置不能满足你的要求,你可以在配置中对其进行相应的定制。在WCF配置节下添加了一个新的子结点<standardEndpoints>,用于对这9个标准终结点进行定制。和自定义绑定一样,你需要为自定义的标准终结点起一个名字。如果某个终结点需要使用到自定义的标准终结点,标准终结点的名称需要设置到终结点配置节的另一个额外的配置属性endpointConfiguration上。

在下面的配置中,我们自定义了一个基于WS-Discovery
1.1的udpDiscoveryEndpoint,并起名为“wsd11”。而这个标准终结点通过终结点配置节的两个属性kind(kind="udpDiscoveryEndpoint")和endpointConfiguration(endpointConfiguration="wsd11")被添加到寄宿的CalculatorService服务的终结点列表中。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <system.serviceModel>
   4:     <services>      
   5:       <service name="Artech.WcfServices.Service.CalculatorService" >
   6:         <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="ws2007HttpBinding" contract="Artech.WcfServices.Contract.ICalculator" />
   7:         <endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="wsd11"/>
   8:       </service>
   9:     </services>
  10:     <standardEndpoints>
  11:       <udpDiscoveryEndpoint>
  12:         <standardEndpoint name="wsd11" discoveryVersion="WSDiscovery11"/>
  13:       </udpDiscoveryEndpoint>
  14:     </standardEndpoints>
  15:   </system.serviceModel>
  16:   ...
  17: </configuration>

二、无.svc文件服务激活

我们都知道,在采用IIS/WAS进行服务寄宿的情况下,我们需要为寄宿的服务创建一个.svc文件。在通常的情况下(当然你也可以以内联的形式将整个服务类型也定义其中),我们仅仅在该.svc文件中定义基本的<%@ServiceHost%>指令信息。其中最重要的指令信息自然是通过Service属性指定的寄宿服务的类型(实际上调用ServiceHostFactory的CreateServieHost方法传入的第一个参数值)。如果采用自定义ServiceHost,我们还需要定义用于创建ServiceHost的ServiceHostFactory的类型(通过Factory属性)。

在《通过自定义ServiceHost实现对WCF的扩展[实例篇]》中,我们介绍了如何通过自定义ServiceHost的方式实现WCF与Unity这个IoC框架进行集成。我们为此创建了自定义的ServiceHost(UnityServiceHost)和相应的ServiceHostFactory(UnityServiceHostFactory)。下面就是采用了UnityServiceHostFactory这个自定义ServiceHostFactory创建的.svc的内容。

   1: <%@ ServiceHost Service="Artech.WcfServices.Servicies.ResourceService: defaultContainer" 
   2: Factory="Artech.WcfExtensions.IoC.UnityServiceHostFactory, Artech.WcfExtensions"%>

从消息交换的角度来说,客户端对IIS/WAS寄宿下服务的调用本质上体现在对.svc这个真实存在的物理文件的访问。如果服务尚未激活,WCF最终根据读取请求的物理文件来激活相应的服务。具体来说,就是获取用于创建ServiceHost的ServiceHostFactory的类型(如果没有通过<%@ServiceHost%>指令的Factory进行显式设置,默认使用的ServiceHostFactory的类型为System.ServiceModel.Activation.ServiceHostFactory)。在正确解析出ServiceHostFactory类型之后,通过反射创建用于寄宿服务的ServiceHost对象。

如果WCF的服务端能够根据请求正确地创建出基于目标服务的ServiceHost,就能解决服务的激活问题。进一步来说,如果服务端能够维护一个Service/ServiceHostFactory与请求地址之间的映射关系,我们就可以不再需要.svc文件,因为.svc对于服务激活来说就是起到了这么一个映射的作用。在最新的WCF中,这么一个映射关系可以在配置文件中进行设置。换言之,如果在配置对这个映射关系进行了相应设置之后,我们将不再需要为服务定义了.svc文件了。

在<system.serviceModel>/<serviceHostingEnvironment>配置节下,具有一个<serviceActivations>子节点。上述的关于Service/ServiceHostFactory与请求地址之间的映射关系就定义在这个配置节点下。具体来说,<serviceActivations>配置节下的配置元素具有三个基本的属性,其中service和factory对用着原来定义在.svc文件中<%@ServiceHost>指令的Service和Factory属性,而relativeAddress则表示服务相对服务寄宿的IIS站点的地址,该地址必须以.svc为后缀。下面一段配置与上面给出的.svc文件具有相同的作用,有了这段配置,.svc就不再需要了。

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <system.serviceModel>   
   4:       ...
   5:       <serviceHostingEnvironment>
   6:         <serviceActivations>
   7:           <add relativeAddress="ResourceService.svc" 
   8:                service="Artech.WcfServices.Servicies.ResourceService: defaultContainer" 
   9:                factory="Artech.WcfExtensions.IoC.UnityServiceHostFactory, Artech.WcfExtensions"/>
  10:         </serviceActivations>
  11:       </serviceHostingEnvironment>
  12:     </system.serviceModel>
  13: </configuration>

再举个例子,如何我们需要通过IIS的方式来寄宿我们熟悉的CalculatorService,在不需要定义.svc的情况下,下面的XML片断代表了所需的最少配置。借助于默认终结点(《[WCF 4.0新特性] 默认终结点》)的自动添加机制,WCF会为寄宿服务实现的每个服务契约针对于每一个基地址添加一个终结点。由于通过配置属性relativeAddress定义的地址就是服务的相对基地址,所以基于这个地址的终结点回自动添加。

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <system.serviceModel>        
   4:       <serviceHostingEnvironment>
   5:         <serviceActivations>
   6:           <add service="Artech.WcfServices.Service.CalculatorService" relativeAddress="OrderService.svc"/>
   7:         </serviceActivations>
   8:       </serviceHostingEnvironment>
   9:     </system.serviceModel>
  10: </configuration>

 

附上刚刚收到的9个新版新浪微博邀请码,有兴趣的朋友可以体验一下:

http://weibo.com/upcode/dgPcW4Gd7

http://weibo.com/upcode/dgPWOkRM9

http://weibo.com/upcode/dgPSQxHsz

http://weibo.com/upcode/dgPPBYReT

http://weibo.com/upcode/dgPPqPvgP

http://weibo.com/upcode/dgPGhy18k

http://weibo.com/upcode/dgPBEOB1M

http://weibo.com/upcode/dgPuEwykK

http://weibo.com/upcode/dgPt72DV0

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2024-12-31 13:47:33

[WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活的相关文章

[WCF 4.0新特性] 默认终结点

很多WCF的初学者是从之前的Web服务上转移过来的,他们非常怀念.asmx Web服务无配置的服务寄宿方式.你只需要在定义Web服务的时候再表示服务操作的方法上应用WebMethodAttribute特性就可以了,完全可以不需要手工进行相应的配置,因为Web服务运行时会自动为你添加默认的配置.但是对于WCF来说,在进行服务寄宿的时候,你必须以编程或者配置的方式为服务添加至少一个终结点,而终结点需要具备基本的ABC三要素. 对于最新版本的WCF编程人员来说,你也可以采用无配置的服务寄宿了,这主要得

[WCF 4.0新特性] 路由服务[实例篇]

在本篇文章中,我们将通过一个具体的实例来演示如何通过路由服务.在这个例子中,我们会创建连个简单的服务HelloServie和GoodbyeService.假设客户端不能直接调用这两个服务,需要使用到路由服务作为两者之间的中介.整个消息路由的场景如下图所示,中间的GreetingService.svc就是代表路由服务,而两个目标服务则通过HelloServie.svc和GoodbyeService.svc表示.路由服务使用的消息筛选器EndpointAddressMessageFilter,即根据

WCF 4.0新特性汇总[共12篇]

一.简化开发体验 默认终结点 默认绑定和行为配置 标准终结点与无(.SVC)文件服务激活 二.路由服务 路由服务[原理篇] 路由服务[实例篇] 三.服务发现 WCF-Discovery的协议基础:WS-Discovery 服务如何能被"发现" 客户端如何能够"探测"到可用的服务? 实例演示:如何利用服务发现机制实现服务的"动态"调用? 让服务自动发送上/下线通知[原理篇] 让服务自动发送上/下线通知[实例篇] 如何利用"发现代理&quo

[WCF 4.0新特性] 默认绑定和行为配置

对于传统的WCF配置系统,无论是绑定的配置还是行为(服务行为和终结点行为)都必须具有一个名称.而正是通过整个配置名称,它们才能被应用到目标对象(终结点或者服务)上.而在实际的项目开发中,绝大部分服务或者终结点都具有相同的绑定和行为,如果能够定义一种默认的绑定和行为,这无疑会简化我们的配置.WCF4.0为此提供了一个新的特性以支持默认绑定和行为的配置. 一. 默认绑定配置 在传统的配置方式下,如果我们需要对终结点的绑定(不论是系统绑定还是自定义绑定)进行定制,我们都需要配置一个"具名"的

[WCF 4.0新特性] 路由服务[原理篇]

在一个典型的服务调用场景中,具有两个基本的角色,即服务的消费者和服务的提供者.从消息交换的角度讲前者一般是消息的最初发送者,而后者则是消息的最终接收者.在很多情况下,由于网络环境的局限,消息的最初发送者和最终接收者不能直接进行消息交换,这就需要一个辅助实现消息路由的中介服务,这就是我们接下来要介绍的路由服务. 目录 一.路由服务就是一个WCF服务       路由服务契约的定义       路由服务契约的定义 二.基于消息内容的路由策略       RoutingBehavior服务行为    

WebSphere Application Server V7.0新特性及各Java EE标准版本支持之对比

WebSphere Application Server V7.0新特性及各Java EE标准版本支持之对比 Application Server Network Deployment, Version 7.0 Operating Systems: AIX, HP-UX, i5/OS, Linux, Solaris, Windows, z/OS Specifications and API documentation 对比的WebSphere版本如下: Version 7.0 Version 6

MySQL5.0新特性教程 存储过程:第三讲

The New SQL Statements 新SQL语句 Variables 变量 在复合语句中声明变量的指令是DECLARE. (1) Example with two DECLARE statements 两个DECLARE语句的例子 WHILE ... END WHILE CREATE PROCEDURE p8 () BEGIN DECLARE a INT; DECLARE b INT; SET a = 5; SET b = 5; INSERT INTO t VALUES (a); SE

MySQL 5.0新特性教程 存储过程:第一讲

mysql|存储过程|教程 作者:mysql AB;翻译:陈朋奕 Introduction 简介 MySQL 5.0 新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的.简单的来说是介绍了"存储过程.触发器.视图.信息架构视图",在此感谢译者陈朋奕的努力. 希望这本书能像内行专家那样与您进行对话,用简单的问题.例子让你学到需要的知识.为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用例,在学习之前也许大家会认为这个用例很难,但是只要跟着

MySQL 5.0 新特性--存储过程(1)

Introduction 简介 MySQL 5.0 新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的.简单的来说是介绍了"存储过程.触发器.视图.信息架构视图",在此感谢译者陈朋奕的努力. 希望这本书能像内行专家那样与您进行对话,用简单的问题.例子让你学到需要的知识.为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用例,在学习之前也许大家会认为这个用例很难,但是只要跟着课程去学,相信很快就能掌握. Conventions and St