如何在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
相关产品推荐
相关产品推荐

