【问题标题】:How does wcf post method get header from incoming request?wcf post 方法如何从传入请求中获取标头?
【发布时间】:2020-10-02 03:17:49
【问题描述】:

我有一个 wcf post 方法,这个方法需要客户端发送的TokenId。 我正在使用下面的代码来获取传入标头的tokeid。

IncomingWebRequestContext woc = WebOperationContext.Current.IncomingRequest;
string tokenId = (woc.Headers["TokenId"] == null ? string.Empty : woc.Headers["TokenId"].ToString());

对于 wcf get 方法,它可以完美运行,并且能够获取令牌 ID,但是对于 wcf post 方法,它会生成以下错误消息。

System.ServiceModel.Channels.MessageProperties get_Properties() ?Message?消息对象已被释放

任何人都知道如何解决问题并确保 wcf post 方法能够从传入请求中获取标头?谢谢

【问题讨论】:

    标签: c# asp.net wcf


    【解决方案1】:

    我看到你的错误原因是“消息对象已被释放”,建议你使用IDispatchMessageInspector截取消息并获取请求头。

    public class ServerMessageLogger : IDispatchMessageInspector
        {
            public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
            {
                IncomingWebRequestContext woc = WebOperationContext.Current.IncomingRequest;
    
                string header = woc.Headers["Host"];
    
                return null;
            }
    
            public void BeforeSendReply(ref Message reply, object correlationState)
            {
    
    
            }
        }
    

    我们在收到请求后截取它的消息,避免消息被销毁。我分别用get方法和post方法测试,都可以成功获取到请求头。

    有关IDispatchMessageInspector的更多信息,请参考以下链接:

    https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.dispatcher.idispatchmessageinspector?view=netframework-4.8

    【讨论】:

    • 嗨,谢谢丁丁,但我可以知道如何调用这个方法吗?我怎样才能得到这三个参数?参考消息请求,IClientChannel通道,InstanceContext instanceContext
    • 这个方法不需要调用,每次收到消息都会自己执行。
    • 嗨,先生,谢谢,但是当我调试我的应用程序时它永远不会自动执行。你的意思是我添加 IDispatchMessageInspector 接口并在我当前的 svc 文件中实现方法。它会自动执行吗?
    • 您还需要将其添加到服务中。详情请参考此链接:stackoverflow.com/questions/62325865/…
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2017-12-08
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多