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。
源代码下载
本系列链接:
WCF 学习总结1 -- 简单实例
WCF 学习总结2 -- 配置WCF
WCF 学习总结3 -- 实例模式
WCF 学习总结4 -- 用Duplex实现消息广播
WCF 学习总结5 -- 消息拦截实现用户名验证
WCF 学习总结6 -- WCF参数与返回值
WCF 学习总结7 -- 流模式实现文件上传
WCF 学习总结8 –- WCF 事务处理
分享到:
相关推荐
客户端通过实现IClientMessageInspector接口,服务端通过实现IDispatchMessageInspector接口,来拦截消息。这种方式是通过扩展Behavior来加入拦截的,所以还需要分别实现IEndpointBehavior(客户端)和...
WCF 实例源代码------聊天室 WCF 实例源代码------聊天室
WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--
wcf,用户名,密码,验证,wcf安全,
WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2
WCF通过消息拦截进行身份验证
WCF服务编程04-05WCF服务编程04-05WCF服务编程04-05WCF服务编程04-05
wcf开发:WCF培训上课实例-带有宿主的WCF程序。WCF培训上课实例-带有宿主的WCF程序WCF培训上课实例-带有宿主的WCF程序WCF培训上课实例-带有宿主的WCF程序
WCF用户名密码验证Demo,含证书相关代码,适合初学者学习WCF服务的调用安全配置。
WCF消息拦截示例代码 通过实现IDispatchMessageInspector(服务端)/IClientMessageInspector(客户端)进行统一的消息拦截处理。
11.再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯
WCF 学习总结7 -- 流模式(Streaming)实现文件上传 http://blog.csdn.net/fangxinggood/article/details/6164017
《WCF 证书移除工具 - WCFMultiCersRemover》 blog文章源码 WCFMultiCersRemover 提供的功能 对X509证书,CurrentUser/LocalMachine存储区 1、移除WCF所有证书 2、移除所有同名证书 3、移除指定证书名的所有证书...
WCF 学习总结4 -- 用Duplex实现消息广播 详细参看:http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx#1667031
wcf实例化-单调服务模式,言简意赅,很容易理解。就是现在积分没发控制,不然1分即可。很简单的代码
这是一个Ext框架,我对此框架很感兴趣。。。特别想了解一下。。。
学习.net wcf 入门版 pdf english
消息安全模式之UserName客户端身份验证需要服务器需要一个有效的可用于TLS 加密和向客户端验证服务身份的 X.509 证书,并且客户端必须信任此服务器证书。 这里使用http协议。建议安全上下文以后,使用共享安全上下文...
微软MSDN的WCF实验室手册 是WCF初学者的入门法宝
WCF服务编程的第四和第五章内容,拿出来分享一下