WCF 学习总结5 -- 消息拦截实现用户名验证

原创 2011年01月16日 17:46:00

WCF建立在基于消息的通信这一概念基础上。通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端;服务操作执行的结果也只能以消息的形式才能被正常地返回到客户端。所以,消息在整个WCF体系结构中处于一个核心的地位,WCF可以看成是一个消息处理的管道,如下图所示:
11_133734_wcf_architecture 
WCF的一个操作(以及操作的参数)被序列化为Soap协议所支持的消息(XML结构),经过服务运行层,交给Binding中所定义的消息传递层,消息传递层由通道(Channel)组成。通道是以某种方式对消息进行处理(例如通过对消息进行身份验证)的组件,通道对消息和消息头进行操作,而服务运行层主要针对消息正文内容进行处理。
IC5864 

方法一. 通过OperationContext直接添加/访问MessageHeader信息
使用OperationContext我们可以:访问当前操作执行环境。 特别是,操作上下文用于访问双工服务中的回调通道、存储整个操作部分的额外状态数据、访问传入消息头和属性以及添加传出消息头和属性。下面用代码演示下如何在MessageHeader中添加额外的信息,进行用户验证。
1. 服务契约

2. 服务实现

3. 客户端实现

运行一下,在服务端通过 Console.WriteLine(OperationContext.Current.RequestContext.RequestMessage); 输出了请求的Message。通过输出的信息,我们可以看到Header里添加的信息:
simpleSoapHeaderMessage

通过上面的代码,我们可以完成类似WebService的SoapHeader验证。但是这样需要我们每个契约都做类似的添加、验证,这样岂不是很繁琐。下面看方法二,通过消息检查器完成统一的用户验证。

方法二. 消息检查器方式添加/访问MessageHeader信息
客户端通过实现IClientMessageInspector接口,服务端通过实现IDispatchMessageInspector接口,来拦截消息。这种方式是通过扩展Behavior来加入拦截的,所以还需要分别实现IEndpointBehavior(客户端)和IServiceBehavior(服务端)接口,并通过配置将消息检查器加入。
工程结构:
 messageInterpectorProjects 实现说明:
【客户端】

1. ClientInterpector 实现:

2. MyClientBehavior 实现: (实现扩展endpointBehavior元素)

3. 配置
修改客户端配置文件,步骤如下:
(1) 在Advanced>Extensions>behavior element extensions中加入自定义的ClientInterpector。
clientInterpectorConfig1 
(2) 在Advanced>Endpoint Behaviors中定义一个Behavior,添加上面配置过的extension
clientInterpectorConfig2 
(3) 修改Client>Endpoints下的Endpoint的Behavior Config指向(2)配置的Behavior。
clientInterpectorConfig3

【服务端】
1. ServiceInterpector 实现:

2. MyServiceBehavior 实现:(实现扩展serviceBehavior元素)

3. 配置
修改服务端配置文件,步骤如下:
(1) 在Advanced>Extensions>behavior element extensions中加入自定义的ServiceInterpector。
serverInterpectorConfig1 
(2) 在Advanced>Service Behaviors中定义一个Behavior,添加上面配置过的extension
serverInterpectorConfig2 
(3) 修改Services下的服务节点的Behavior Config指向(2)配置的Behavior。
serverInterpectorConfig3 

源代码下载


本系列链接:

WCF 学习总结1 -- 简单实例

WCF 学习总结2 -- 配置WCF

WCF 学习总结3 -- 实例模式

WCF 学习总结4 -- 用Duplex实现消息广播

WCF 学习总结5 -- 消息拦截实现用户名验证

WCF 学习总结6 -- WCF参数与返回值

WCF 学习总结7 -- 流模式实现文件上传

WCF 学习总结8 –- WCF 事务处理

传说中的WCF(10):消息拦截与篡改

我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子。当然,也有人是通过借...
  • tcjiaan
  • tcjiaan
  • 2012年12月09日 12:26
  • 9865

WCF笔记(6)消息拦截与篡改

要对SOAP消息进行拦截和修改,我们需要实现两个接口,它们都位于System.ServiceModel.Dispatcher (程序集System.ServiceModel)。下面分别价绍。 接...
  • ljf5566
  • ljf5566
  • 2013年03月24日 16:23
  • 2945

REST服务Post创建以及调用小例子

服务端接口代码 [OperationContract] [WebInvoke(UriTemplate = "TestAddData", Method = "POST")] ...
  • XMM_1030
  • XMM_1030
  • 2014年02月12日 16:41
  • 6817

wcf验证消息头

服务器端 public CommonService() { int index = OperationContext.Current.IncomingMess...
  • xiaoguang44
  • xiaoguang44
  • 2012年04月17日 17:19
  • 1122

WCF接收消息头

用OperationContext.Current.IncomingMessageHeaders得到从客户端收到的消息头 1.修改Server端的MyService ...
  • BiCai2
  • BiCai2
  • 2017年06月23日 15:19
  • 215

MFC edit控件实现自动换行

必须设置Vertical Scrollbar = TRUE 必须设置MultiLine = TRUE 必须设置Horizontal Scrollbar = FALSE 必须设置Auto HScr...
  • a200638012
  • a200638012
  • 2016年07月08日 17:22
  • 4377

设置MFC Edit control可以换行显示

MFC Edit control可以换行显示 1.设置edit control 属性Multiline为true 2.写入数据时,想换行的时候写入"\r\n"即可,CString str.Re...
  • a780902723
  • a780902723
  • 2014年12月09日 16:52
  • 2275

MFC中EDIT控件实现换行

一、通过回车换行: 这里要有两个设置 .将控件的属性设置为Mutilines->true; .将控件的另一个属性设置为Want return->true. 水平和垂直滚动条设置...
  • dearwind153
  • dearwind153
  • 2015年12月09日 21:13
  • 3644

WCF笔记(6)消息拦截与篡改

要对SOAP消息进行拦截和修改,我们需要实现两个接口,它们都位于System.ServiceModel.Dispatcher (程序集System.ServiceModel)。下面分别价绍。 接...
  • ljf5566
  • ljf5566
  • 2013年03月24日 16:23
  • 2945

使用WCF实现服务器向客户端的信息推送

前断时间的一个项目中需要实时提醒待办事项,而客户又不想花钱买MAS 机(电信服务商提供的企业短信接口)。所以我们打算将OA中的待办事项通过桌面客户端来进行提醒,但是客户端如果采用定时刷新的方式直接在O...
  • fengchun_doff
  • fengchun_doff
  • 2014年01月21日 16:28
  • 5521
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WCF 学习总结5 -- 消息拦截实现用户名验证
举报原因:
原因补充:

(最多只允许输入30个字)