行为是WCF架构中一个重要的扩展点。它们在客户端或者服务端运行时(runtime)被构造时以及每个服务调用时使用。当运行时启动时,它通过检测传递给ClientChannel的类型结构或者ServiceHost来寻找行为,然后在配置文件中寻找。行为也可以在代码中和在打开ServiceHost之前添加到ServiceDescription 对象中定义,或者通过在代码中使用属性,或者在配置文件中。
行为实现检测器-检测提供给它们的对象的代码。在消息层有消息检测器运行,在操作参数上有参数检测器运行。在操作层,行为主要负责为一个给定的SOAP输入消息选择调用哪个方法运行并再次调用那个方法。
行为控制服务类和它们的操作的实例和并发。实例由InstanceContextMode设置控制,可以是Single, PerCall或者PerSession.并发由ConcurrencyMode设置控制并可以是Single, Multiple或者Reentrant(单一的,但是是线程安全的代码)。他们一起控制一个服务的并发层次,如果将并发看成一个频谱,那么从为所有调用只创建一个实例的起点开始到为每次调用创建一个实例的终点结束都可以控制。服务行为也允许你限制并发调用,实例或者会话的数量。
一个重要的服务行为是serviceMetadata行为。这个行为在WSDL中暴露WCF类型系统和ServiceDescription模型以便于客户端知道在哪里去找服务,如何使用服务以及要与服务进行什么消息通信。更普遍来说,serviceMetadata终结点使用WS-MEX协议以便于它可以与不同平台的客户端通信并在很多格式中返回元数据信息。仅仅当一个服务包含这个行为时它才会暴露WSDL。这与很多开发人员以前使用的ASMX不同,ASMX默认情况下暴露WSDL.
WCF在行为中实现了生命周期短的,ACID形式的事务。事务可以在一个服务中或者跨越不同服务的边界流转。事务在操作行为层实现,尽管在终结点和服务层都要满足特定的条件。例如,为了在客户端和服务端间进行事务流转,服务终结点必须使用一个支持会话的绑定,比如wsHttpBinding.会话必须在服务端允许以便于事务可以在服务端边界间传输。操作行为允许开发人员确定事务的隔离级别,管理员可以控制超时属性。
WCF支持三种事务管理器,一个是一个进程内的本地事务,一个是只用在Vista下的资源,另外一个是分布式事务协调器。额外的,跨越服务边界的通信可以使用一个Windows下才有的扩展RPC的事务协议,或者可以使用基于标准的WS-AT协议。
自定义行为允许开发人员在服务端,终结点,契约或者操作层创建新的行为。这些行为允许当消息在客户端和服务端之间流转时对其进行检测和修改。它们也允许开发人员或系统管理员当服务启动时验证或者修改WCF运行时。
至此,第五章“行为”的内容已经全部讲述完毕,下一章是“序列化和编码”,精彩稍后继续…