我们有一个解决方案,我们使用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请求中的值的位置,以便可以在堆栈中的较低位置访问它们?
答案 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"];