【问题标题】:IClientMessageInspector BeforeSendRequest method is not working when setting header using OperationContextScope使用 OperationContextScope 设置标头时,IClientMessageInspector BeforeSendRequest 方法不起作用
【发布时间】:2020-10-02 07:26:27
【问题描述】:

我有一个客户端代码实现来使用具有 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 的消息拦截器插入令牌)。

【问题讨论】:

    标签: wcf soap client c#-3.0


    【解决方案1】:

    根据你的描述,我做了测试,成功地同时使用了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");
    

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2016-10-22
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      相关资源
      最近更新 更多