如何通过编程方式设置WCF服务调用的SOAP身份头?
WCF编程方式添加自定义SOAP头(Identity节点)完整实现
实现思路
通过WCF的IClientMessageInspector接口自定义消息检查器,在请求发送前插入目标SOAP头;再借助IEndpointBehavior将检查器绑定到客户端终结点,实现每次服务调用自动携带指定头信息。
步骤1:定义与SOAP头匹配的实体类
先创建对应<Identity>节点结构的实体类,通过特性映射XML命名空间和节点:
using System.Runtime.Serialization; [DataContract(Namespace = "http://.../")] // 必须与示例中Identity节点的Namespace完全一致 public class IdentityHeader { [DataMember] public string AppName { get; set; } [DataMember] public string AppKey { get; set; } [DataMember] public string UserId { get; set; } [DataMember] public string IdentityProvider { get; set; } }
步骤2:实现自定义消息检查器
创建实现IClientMessageInspector的类,在BeforeSendRequest方法中构造并插入SOAP头:
using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; public class IdentityMessageInspector : IClientMessageInspector { private readonly IdentityHeader _identityData; public IdentityMessageInspector(IdentityHeader identityData) { _identityData = identityData; } public object BeforeSendRequest(ref Message request, IClientChannel channel) { // 创建SOAP头实例,指定节点名、命名空间和内容 var identityHeader = MessageHeader.CreateHeader( "Identity", "http://.../", // 与实体类的Namespace保持一致 _identityData); // 将头添加到请求的Header集合中 request.Headers.Add(identityHeader); return null; } public void AfterReceiveReply(ref Message reply, object correlationState) { // 无需处理回复时留空即可 } }
步骤3:实现终结点行为类
创建实现IEndpointBehavior的类,用于将消息检查器注入客户端运行时:
using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; public class IdentityEndpointBehavior : IEndpointBehavior { private readonly IdentityHeader _identityData; public IdentityEndpointBehavior(IdentityHeader identityData) { _identityData = identityData; } public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { // 向客户端运行时添加自定义消息检查器 clientRuntime.ClientMessageInspectors.Add(new IdentityMessageInspector(_identityData)); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } }
步骤4:客户端调用时应用行为
在创建WCF客户端实例后,将自定义行为附加到终结点,后续所有调用都会自动携带SOAP头:
// 1. 构造Identity头的具体内容 var identityInfo = new IdentityHeader { AppName = "test1", AppKey = "test2", UserId = "test3", IdentityProvider = "test4" }; // 2. 创建WCF客户端实例(替换为你的实际客户端类) using (var serviceClient = new YourServiceClient()) { // 3. 将自定义行为添加到客户端终结点 serviceClient.Endpoint.Behaviors.Add(new IdentityEndpointBehavior(identityInfo)); // 4. 调用服务方法,此时SOAP头已自动插入 serviceClient.TargetServiceMethod(); }
验证方式
可以使用Fiddler或WCF跟踪工具抓取请求,确认<Identity>节点及其子节点是否正确出现在<soapenv:Header>区域中。
内容的提问来源于stack exchange,提问作者bit
相关产品推荐
相关产品推荐

