You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:48:35