我有一个拦截器,它从WCF请求的消息头中选择数据。见下文:
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
_CurrentRequest = request;
SetupSecurityPrincipal();
ThreadExtension.PersonID = GetIntHeader(HeaderKeys.PersonID);
return null;
}
ThreadExtension
(忽略名称,无意义)是一个具有静态属性的类,它提供get / set HttpContext.Current
。见下文:
public class ThreadExtension
{
public static int? PersonID
{
get { return (int?)HttpContext.Current.Items["PersonID"]; }
set { HttpContext.Current.Items["PersonID"] = value; }
}
}
所以问题在于我们的Web端到WCF Web服务的请求,如果我们有2个请求发生在一起足够接近,有时ThreadContext
中的信息会发生变化,导致一个人的数据出现在另一个人的会话中。
所以我的问题是,我们做错了什么?在这里使用静态属性是不是正确的方法?理想情况下,我们只需要与WCF中的请求相关联的内容,这样我们就可以在几个地方找到它而不会一直传递数据。
非常感谢您提供的任何帮助或建议。
答案 0 :(得分:2)
可疑线是:
_CurrentRequest = request;
WCF消息检查器通常是单例,因此实例变量实际上是静态的。设置它然后从类中的其他位置读取它将导致您看到的非确定性行为。