我一直想知道如何通过静态方法访问当前http上下文的正确状态:
HttpContext.Current.Session["foo"] = "bar";
在任何其他程序中,在任何其他地方,我最初关于使用这样的静态访问器的假设是更改它将在所有线程中更改它。同样,另一个运行我的线程在我尝试使用它的时候会改变它。
但是HttpContext.Current的行为并不像这样。即使通过静态访问器,它也为给定请求提供适当的状态。这是怎么回事?
答案 0 :(得分:1)
好吧,它正在包装底层请求和管道对象;静态对象确实会在回发中保留自己(跨所有请求),这是我必须学习的一个痛苦的教训......但无论如何,对象不会被保留,但是暴露底层服务和管道的静态对象可以正常工作。
我的意思是HttpContext.Current可能不会被保留,因为在下面,它实际上只暴露了.NET框架中的可用服务。这些服务对于请求/用户可能是唯一的,因为它将由所访问的服务决定(会话具有内置于服务中的内容以使其对用户而言是唯一的)。
HTH。
答案 1 :(得分:1)
基本上,HttpContext有一个名为Current的静态属性getter。在该属性中,getter是确定要返回的正确HttpContext对象的代码。**之后,您正在使用实例方法。您的代码段相当于:
//Use a static property getter to get the correct HttpContext instance
HttpContext ctx = HttpContext.Current;
// Now use that instance
ctx.Session["foo"] = "bar";
它的部分工作方式并不神奇 - ASP.Net运行时为每个HttpContext新实例的请求设置 HttpContext.Current。该setter将实例存储在线程静态存储***中。然后,getter将实例从当前线程的存储中拉出来。
需要注意的关键是静态属性或方法不仅仅是全局字段 - 它可以使用当前线程之类的东西来改变它的作用或返回的内容。
**实际上,HttpContext.Current委托给ContextBase,后者委托给CallContext,后者最终使用Thread上的方法,但概念是相同的。
***实际上,运行时在请求期间处理线程切换的工作量更多。
答案 2 :(得分:0)
HttpContext.Current是特定于线程的,因此看起来像volatile(想想它就像线程上的psuedo扩展方法),Session是一个与应用程序(或应用程序线程)相关联的静态对象。简而言之,Context.Current将与当前线程进行interogate。