WCF建立在基于消息的通信这一概念基础上。通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端;服务操作执行的结果也只能以消息的形式才能被正常地返回到客户端。所以,消息在整个WCF体系结构中处于一个核心的地位,WCF可以看成是一个消息处理的管道,如下图所示:
WCF的一个操作(以及操作的参数)被序列化为Soap协议所支持的消息(XML结构),经过服务运行层,交给Binding中所定义的消息传递层,消息传递层由通道(Channel)组成。通道是以某种方式对消息进行处理(例如通过对消息进行身份验证)的组件,通道对消息和消息头进行操作,而服务运行层主要针对消息正文内容进行处理。
方法一. 通过OperationContext直接添加/访问MessageHeader信息
使用OperationContext我们可以:访问当前操作执行环境。 特别是,操作上下文用于访问双工服务中的回调通道、存储整个操作部分的额外状态数据、访问传入消息头和属性以及添加传出消息头和属性。下面用代码演示下如何在MessageHeader中添加额外的信息,进行用户验证。
1. 服务契约
2. 服务实现
3. 客户端实现
运行一下,在服务端通过 Console.WriteLine(OperationContext.Current.RequestContext.RequestMessage); 输出了请求的Message。通过输出的信息,我们可以看到Header里添加的信息:
通过上面的代码,我们可以完成类似WebService的SoapHeader验证。但是这样需要我们每个契约都做类似的添加、验证,这样岂不是很繁琐。下面看方法二,通过消息检查器完成统一的用户验证。
方法二. 消息检查器方式添加/访问MessageHeader信息
客户端通过实现IClientMessageInspector接口,服务端通过实现IDispatchMessageInspector接口,来拦截消息。这种方式是通过扩展Behavior来加入拦截的,所以还需要分别实现IEndpointBehavior(客户端)和IServiceBehavior(服务端)接口,并通过配置将消息检查器加入。
工程结构:
实现说明:
【客户端】
1. ClientInterpector 实现:
2. MyClientBehavior 实现: (实现扩展endpointBehavior元素)
3. 配置
修改客户端配置文件,步骤如下:
(1) 在Advanced>Extensions>behavior element extensions中加入自定义的ClientInterpector。
(2) 在Advanced>Endpoint Behaviors中定义一个Behavior,添加上面配置过的extension
(3) 修改Client>Endpoints下的Endpoint的Behavior Config指向(2)配置的Behavior。
【服务端】
1. ServiceInterpector 实现:
2. MyServiceBehavior 实现:(实现扩展serviceBehavior元素)
3. 配置
修改服务端配置文件,步骤如下:
(1) 在Advanced>Extensions>behavior element extensions中加入自定义的ServiceInterpector。
(2) 在Advanced>Service Behaviors中定义一个Behavior,添加上面配置过的extension
(3) 修改Services下的服务节点的Behavior Config指向(2)配置的Behavior。
源代码下载
本系列链接: