【问题标题】:System.Web.HttpContext.Current is static between requestsSystem.Web.HttpContext.Current 在请求之间是静态的
【发布时间】:2013-03-23 11:38:52
【问题描述】:

在我的 Web 应用程序中,我使用 System.Web.HttpContext.Current,它代表当前的命中上下文,我想知道它是如何从任何地方访问的,直到我注意到它是 static 成员! 虽然它是一个静态成员,但如果几乎同时收到两个请求,它如何保持其值。 像下面这样:

#Req1----> | set the value of the static field to req1
#Req2----> | set the value of the static field to req2
#Req1      | use that static its supposed to be req2 while its req1

我是否错过了某些东西,或者其中有什么技巧?

【问题讨论】:

    标签: c# asp.net request static-members


    【解决方案1】:

    这是一个非常聪明的问题!

    HttpContext.Current 被实现为线程局部变量。实际上,它是使用LogicalCallContext 实现的,但它的行为类似于线程本地。

    这样想:

    [ThreadLocal]
    public static HttpContext Current;
    

    是的,这意味着只有主请求线程可以访问它。它将在您启动的其他线程上为空。

    【讨论】:

    • 先生,非常感谢您的回答!现在一切都清楚多了,但我有一个问题,its implemented using LogicalCallContext 是什么意思,再次感谢您非常有帮助的回答。
    • 当您使用 Reflector 打开属性时,您会发现该值不是来自静态线程本地字段,而是来自 CallContext,进而来自 LogicalCallContext。它们是我知之甚少的低级基础设施类。它们本质上是每个线程的数据结构(但不完全是)。我认为 ASP.NET 或 WCF 中的每个请求都有一个这样的调用上下文,但我可能错了。
    • 非常感谢先生,我会搜索更多有关此主题的信息,但您的回答很完整!再次感谢。
    猜你喜欢
    • 2015-11-03
    • 2018-03-11
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2012-08-24
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多