你能在WCF中使用静态方法来访问HttpContext.Current.Items吗?

时间:2011-08-17 04:46:17

标签: c# wcf static-members interceptor

我有一个拦截器,它从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中的请求相关联的内容,这样我们就可以在几个地方找到它而不会一直传递数据。

非常感谢您提供的任何帮助或建议。

1 个答案:

答案 0 :(得分:2)

可疑线是:

_CurrentRequest = request;

WCF消息检查器通常是单例,因此实例变量实际上是静态的。设置它然后从类中的其他位置读取它将导致您看到的非确定性行为。