wcf post 方法如何从传入请求中获取标头?

Posted

技术标签:

【中文标题】wcf post 方法如何从传入请求中获取标头?【英文标题】:How does wcf post method get header from incoming request? 【发布时间】: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 方法能够从传入请求中获取标头?谢谢

【问题讨论】:

【参考方案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 文件中实现方法。它会自动执行吗? 您还需要将其添加到服务中。详情请参考此链接:***.com/questions/62325865/…

以上是关于wcf post 方法如何从传入请求中获取标头?的主要内容,如果未能解决你的问题,请参考以下文章

寻找一种从传入的 http 请求中获取 HTTP Digest Authentication 标头的方法

如何从使用 axios 发送的 POST 请求中获取 Content-Length 标头?

wcf在post请求时,关于string类型参数传入中文的处理

WCF Rest POST 方法接受 JSON 和 XML

在 WCF REST 服务 POST 方法中处理 Json 请求数据

如何从基于 REST 的 WCF 服务中读取授权标头?