WCF服务端运行时架构体系详解[下篇]
作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象。站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象。如果站在WCF服务端运行时框架来说,终结点实际上指代的是终结点分发器(EndpointDispatcher)。而ServiceEndpoint与EndpointDispatcher是一一匹配的,并且前者是创建后者的基础。而终结点分发器具有自己的运行,即分发运行时(DispatchRuntime)。
目录
一、终结点分发器(EndpointDispatcher)
二、分发运行时(DispatchRuntime)
可扩展组件
认证与授权
服务实例上下文
会话关闭通知
同步上下文
消息检验
操作与操作选择
可扩展属性
授权
审核
事务与会话
未处理操作
SOAP ValidateMustUnderstand处理
并发控制
一、终结点分发器(EndpointDispatcher)
除了之前介绍的三个辅助信道分发器向匹配的终结点分发器实施消息路由的三个属性(AddressFilter、ContractFilter和FilterPriority)之外,你还可以通过属性ContractName和ContractNamespace得到服务契约的名称和命名空间,以通过EndpointAddress属性得到相应的终结点地址。将消息路由到该终结点分发器的信道分发器可以通过属性ChannelDispatcher获得。但是对于终结点分发器来说,其重要的还是通过属性DispatchRuntime表示的分发运行时。
1: public class EndpointDispatcher
2: {
3: //其他成员
4: public string ContractName { get; }
5: public string ContractNamespace { get; }
6:
7: public MessageFilter AddressFilter { get; set; }
8: public MessageFilter ContractFilter { get; set; }
9: public int FilterPriority { get; set; }
10:
11: public ChannelDispatcher ChannelDispatcher { get; }
12: public DispatchRuntime DispatchRuntime { get; }
13: public EndpointAddress EndpointAddress { get; }
14: }
二、分发运行时(DispatchRuntime)
毫不夸张地说,终结点分发器的分发运行时是WCF整个服务端运行时架构体系的核心,同时也是对WCF服务端服务模型进行扩展重点考虑的对象。分发运行时之所以具有如此重要的地位,原因在于:终结点分发器接收到从信道分发器路由的消息的整个处理是在分发运行时中进行的。
和上面分析信道分发器一样,我们首先来看看分发运行时具有哪些可扩展的组件。终结点的分发运行时对应的类型为DispatchRuntime。下面的代码片断列出了这些扩展组件在DispatchRuntime中的对应的属性定义。
1: public sealed class DispatchRuntime
2: {
3: //其他成员
4: public ServiceAuthorizationManager ServiceAuthorizationManager { get; set; }
5: public ServiceAuthenticationManager ServiceAuthenticationManager { get; set; }
6: public RoleProvider RoleProvider { get; set; }
7: public ReadOnlyCollection<IAuthorizationPolicy> ExternalAuthorizationPolicies { get; set; }
8:
9: public IInstanceContextProvider InstanceContextProvider { get; set; }
10: public SynchronizedCollection<IInstanceContextInitializer> InstanceContextInitializers { get; }
11: public InstanceContext SingletonInstanceContext { get; set; }
12: public IInstanceProvider InstanceProvider { get; set; }
13:
14: public SynchronizedCollection<IInputSessionShutdown> InputSessionShutdownHandlers { get; }
15: public SynchronizationContext SynchronizationContext { get; set; }
16:
17: public SynchronizedCollection<IDispatchMessageInspector> MessageInspectors { get; }
18:
19: public SynchronizedKeyedCollection<string, DispatchOperation> Operations { get; }
20: public IDispatchOperationSelector OperationSelector { get; set; }
21: }
1、认证与授权
分发运行时具有一组与安全相关的组件,具体来说是这组组件是与身份认证和授权相关。它们包括用于进行认证的ServiceAuthorizationManager,用于进行授权的ServiceAuthorizationManager,以及在在ASP.NET Roles安全主体权限模式下实现授权采用的RoleProvider和在自定义安全主体权限模式下自定义的授权策略(通过ExternalAuthorizationPolicies属性表示)。如果你阅读了《深入剖析授权在WCF中的实现[共14篇]》,相对对这四个对象不会感到陌生。
2、服务实例上下文
服务端框架对服务调用请求的处理最终必然体现在服务实例的创建和操作方法的调用。而服务实例并不是单独存储,而是存在于一个上下文中,该上下文被称为实例上下文(InstanceContext)。WCF服务端框架通过一个被称为实例上下文提供者(InstanceContextProvider)来提供基于当前服务请求对应的实例上下文。这里所说的实例上下文的提供机制包括两种情况下:创建新的服务上下文,或者提供一个现有之前创建好的实例上下文。
实例上下文通过类型InstanceContext表示,而所有的实例上下文提供者实现了一个具有如下定义的接口IInstanceContextProvider。WCF为我们提供了相应的实例上下文提供者以实现不同的实例上下文模式:单调(PerCall)、会话(PerSession)和单例(Single)。关于实例上下文、实例上下文模式以及它们最终采用怎样的实例上下文提供者,在《WCF技术剖析(卷1)》第9章《实例管理与会话》有详细的介绍。在这里你需要了解的是:WCF服务端框建最终使用的实例上下文提供者反映在InstanceContextProvider属性上。如果采用单例实例上下文模式,最终提供的实例上下文赋值给了属性SingletonInstanceContext。
1: public inte易做图ce IInstanceContextProvider
2: {
3: InstanceContext GetExistingInstanceContext(Message message, IContextChannel channel);
4: void InitializeInstanceContext(InstanceContext instanceContext, Message message, IContextChannel channel);
5: bool IsIdle(InstanceContext instanceContext);
6: void NotifyIdle(InstanceContextIdleCallback callback, InstanceContext instanceContext);
7: }
当实例上下文被创建出来后,如果你需要对其进行一些初始化操作。比如通过检查被创建出来的实例上下文并执行相应的一些操作,或者直接对创建的实例上下文作相应的修改。实例上下文的初始化工作通过一个被称作实例上下文初始化器(InstanceContextInitializer)来实现,它们的类型实现了一个具有如下定义的接口IInstanceContextInitializer。相应的初始化操作定义在Initialize方法中。
1: pub
补充:Web开发 , ASP.Net ,