2013-03-23 91 views
7

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

#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 

我错过理解的东西,或在它里面一招还是什么?

回答

5

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

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

把它看成是这样的:

[ThreadLocal] 
public static HttpContext Current; 

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

+0

先生,非常感谢您的回答!现在一切都变得更加清晰了,但是我有一个问题,你用'LogicalCallContext'实现了什么意思,并且再次感谢你提供了非常有用的答案。 – Hilmi 2013-03-23 14:35:46

+0

当您使用Reflector撬开属性时,您会发现该值不是来自静态线程本地字段,而是来自CallContext,而来自LogicalCallContext。他们是我不了解的低级基础课。它们实质上是每个线程的数据结构(但不完全)。我认为ASP.NET或WCF中的每个请求都有一个这样的调用上下文,但我可能是错误的。 – usr 2013-03-23 14:44:25

+0

非常感谢先生,我会进一步搜索这个主题,但你的答案已经完成!再次感谢。 – Hilmi 2013-03-23 14:47:12