wcf - 使用 OperationContextScope 设置标头时,IClientMessageInspector BeforeSendRequest 方法不起作用
问题描述
我有一个客户端代码实现来使用具有 IEndpointBehavior 的服务来跟踪请求和响应数据。
在我使用 OperationContextScope 实现不记名令牌之前,一切正常。
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Bearer " + accessToken;
var context = new OperationContext(client.InnerChannel);
context.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
var operationContext = new OperationContextScope(context);
BeforeSendRequest, AfterReceiveReply 停止调用,因为我实现了基于令牌的身份验证,并且当我删除用于将令牌添加到标头的 OperationContextScope 代码时它正在工作。
我需要帮助来了解如何同时使用这两者(使用 OperationContextScope 和 IEndpointBehavior 插入消息拦截器的令牌)。
解决方案
根据你的描述,我做了测试,成功的同时使用了OperationContextScope和IEndpointBehavior。你可能把OperationContextScope的代码放在IEndpointBehavior的代码前面,这样会导致IEndpointBehavior的代码失效。
Service1Client service1Client = new Service1Client();
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Bearer";
var context = new OperationContext(service1Client.InnerChannel);
context.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
var operationContext = new OperationContextScope(context);
service1Client.Endpoint.Behaviors.Add(new Interceptor());
service1Client.GetUserData("Test");
上面的代码结构会导致这个问题。
正确的代码结构应如下所示:
Service1Client service1Client = new Service1Client();
service1Client.Endpoint.Behaviors.Add(new Interceptor());
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Bearer";
var context = new OperationContext(service1Client.InnerChannel);
context.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
var operationContext = new OperationContextScope(context);
service1Client.GetUserData("Test");
推荐阅读
- visual-studio - 为什么我的分支指令没有跳转到给定的地址?
- python - 使用量子计算机进行距离估计
- cuda - cuda 将设备数据复制到主机(再次)
- xslt-2.0 - 可以从变量值设置 xsl:number 的 level 属性吗?
- android - Glide centerCrop() 不适用于 CustomTarget
- sql - 如何并行取消嵌套多个postgres jsonb数组
- javascript - 启动画面无法正常工作
- python - Python刮板确实返回空
- java - 如何从 application.properties 文件中添加跨源 url 值?
- azure - 在 Azure 应用服务中,配置通配符自定义域时出错