0

我们有一个解决方案,我们使用 WCF 客户端消息检查器从 http 标头中读取关联 ID(和其他值)。

然后我们将此值存储在 System.ServiceModel.OperationContext.Current.IncomingMessageProperties 中。

OperationContext.Current 是当前线程的执行上下文。

但是,根据 Jon Skeet 对这个问题的回答:IIS 中的请求会在单个线程上运行吗? asp.net 请求将在线程之间跳转。

这正是我们正在经历的,即在请求执行期间相关 id 会发生变化。

有没有什么地方可以存储来自 http 请求的值,以便可以在堆栈的较低位置访问它们?

4

2 回答 2

2

我已经使用该System.Web.HttpContext.Current.Items集合来存储我们在 MessageInspector 中获取的值,例如

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        var httpResponse =
            reply.Properties[HttpResponseMessageProperty.Name] 
                   as HttpResponseMessageProperty;

        if (httpResponse != null)
        {
            string cookie = httpResponse.Headers[HttpResponseHeader.SetCookie];

            if (!string.IsNullOrEmpty(cookie))
            {
                System.Web.HttpContext.Current.Items.Add("MyCookies", cookie);
            }
        }
    }

在堆栈的其他地方,可以使用相同的键从 Items 集合中获取值。

有关更多详细信息,请查看 Scott Hanselman 的这篇文章

于 2012-08-29T08:55:09.377 回答
1

这对我有用

 var headers =OperationContext.Current.IncomingMessageProperties["httpRequest"];
        var apiToken = ((HttpRequestMessageProperty)headers).Headers["apiKey"];
于 2016-09-10T23:32:07.890 回答