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

如何在C#/.NET中通过Web引用调用WCF服务并添加SecurityToken请求头

解决WCF客户端调用getDataFromDS时添加SecurityToken请求头的问题

下面提供两种实用方案,适配你的场景:

方案一:单次调用时直接添加请求头(快速实现)

如果仅针对getDataFromDS单个方法添加请求头,用OperationContextScope可以快速搞定,代码示例如下:

// 实例化WSDL生成的WCF客户端
var client = new YourGeneratedClient();

try
{
    using (new OperationContextScope(client.InnerChannel))
    {
        // 创建请求头属性对象
        var requestProperty = new HttpRequestMessageProperty();
        // 添加SecurityToken请求头,替换为实际获取到的Token值
        requestProperty.Headers["SecurityToken"] = "你的有效Token内容";
        
        // 将请求头附加到当前操作上下文
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty;
        
        // 调用目标方法
        var result = client.getDataFromDS(你的方法参数);
    }
}
finally
{
    client.Close();
}

方案二:自定义消息检查器(全局/按需适配)

如果需要给多个方法添加请求头,或者想精准控制哪些方法需要携带Token,推荐用IClientMessageInspector自定义消息拦截器,实现只给指定方法加头:

1. 实现消息检查器类

public class SecurityTokenInspector : IClientMessageInspector
{
    private readonly string _securityToken;

    public SecurityTokenInspector(string securityToken)
    {
        _securityToken = securityToken;
    }

    // 发送请求前插入请求头
    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        // 获取当前调用的操作名称
        var operationName = OperationContext.Current.IncomingMessageHeaders.Action.Split('/').Last();
        
        // 仅对getDataFromDS方法添加请求头,login方法不受影响
        if (operationName.Equals("getDataFromDS", StringComparison.OrdinalIgnoreCase))
        {
            HttpRequestMessageProperty requestProperty;
            if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name))
            {
                requestProperty = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
            }
            else
            {
                requestProperty = new HttpRequestMessageProperty();
                request.Properties.Add(HttpRequestMessageProperty.Name, requestProperty);
            }
            requestProperty.Headers["SecurityToken"] = _securityToken;
        }
        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        // 无需处理响应,留空即可
    }
}

2. 创建行为类注册检查器

public class SecurityTokenBehavior : IEndpointBehavior
{
    private readonly string _securityToken;

    public SecurityTokenBehavior(string securityToken)
    {
        _securityToken = securityToken;
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        // 将自定义检查器添加到客户端运行时
        clientRuntime.ClientMessageInspectors.Add(new SecurityTokenInspector(_securityToken));
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }
}

3. 给客户端绑定行为

var client = new YourGeneratedClient();
// 先调用login方法获取有效Token
var loginToken = client.login(你的LoginDTO参数);
// 将行为添加到客户端的Endpoint
client.Endpoint.Behaviors.Add(new SecurityTokenBehavior(loginToken));

// 后续调用方法时,getDataFromDS会自动带上SecurityToken请求头
var dataResult = client.getDataFromDS(你的方法参数);

client.Close();

注意事项

  • 替换代码中的YourGeneratedClient为你实际导入WSDL生成的客户端类名
  • SecurityToken的键名要和Postman中使用的完全一致(注意大小写)
  • 如果Token有过期时间,记得在过期前重新调用login获取新Token

内容的提问来源于stack exchange,提问作者MrD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:20:29