在Web服务请求中共享信息

时间:2012-08-28 12:48:05

标签: c# asp.net multithreading wcf logging

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

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

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

然而,根据Jon Skeet对此问题的回答:Will a request in IIS run on a single thread? asp.net请求将在线程之间跳转。

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

是否存在我们可以存储http请求中的值的位置,以便可以在堆栈中的较低位置访问它们?

2 个答案:

答案 0 :(得分: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的article了解详情。

答案 1 :(得分:1)

这对我有用

 var headers =OperationContext.Current.IncomingMessageProperties["httpRequest"];
        var apiToken = ((HttpRequestMessageProperty)headers).Headers["apiKey"];