【问题标题】:How does HttpContext.Current work, providing context appropriate state off a static variable?HttpContext.Current 如何工作,为静态变量提供上下文适当的状态?
【发布时间】:2010-03-31 18:04:51
【问题描述】:

我一直想知道如何通过静态方法访问当前 http 上下文的正确状态:

HttpContext.Current.Session["foo"] = "bar";

在任何其他程序中,在其他任何地方,我对使用这样的静态访问器的最初假设是更改它会在所有线程中更改它。同样,另一个运行我的线程在我尝试使用它时对我进行了更改。

但是 HttpContext.Current 的行为不是这样的。它为给定的请求提供适当的状态,甚至通过静态访问器。这是怎么回事?

【问题讨论】:

    标签: .net asp.net


    【解决方案1】:

    基本上,HttpContext 有一个名为 Current 的静态属性 getter。在该属性中,getter 是确定要返回的正确 HttpContext 对象的代码。** 之后,您将使用实例方法。你的 sn-p 相当于:

    //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.Current 用于对新的 HttpContext 实例的每个请求。该设置器将实例存储在线程静态存储中***。然后,getter 将实例从当前线程的存储中拉出。

    要注意的关键是静态属性或方法不仅仅是全局字段 - 它可以使用当前线程等内容来改变它所做的事情或返回的内容。

    **实际上,HttpContext.Current 委托给 ContextBase,后者委托给 CallContext,最终使用 Thread 上的方法,但概念是一样的。

    ***实际上,运行时在处理请求期间的线程切换方面做得更多。

    【讨论】:

      【解决方案2】:

      嗯,它包装了底层的请求和管道对象;静态对象确实会在回发(所有请求)中保留自己,这是我必须吸取的一个痛苦教训……但无论如何,对象不会被保留,但暴露底层服务和管道的静态对象可以正常工作。

      我的意思是 HttpContext.Current 可能不会被保留,因为在下面,它实际上只是公开了 .NET 框架内的可用服务。这些服务对于请求/用户可能是唯一的,因为这取决于访问的服务来确定(会话在服务中内置了一些东西,以使其对用户唯一)。

      HTH。

      【讨论】:

        【解决方案3】:

        HttpContext.Current 是特定于线程的,因此看起来很不稳定(将其想象为线程上的伪扩展方法),Session 是与应用程序(或应用程序线程)关联的静态对象。简而言之 Context.Current 将询问当前线程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-10
          • 1970-01-01
          • 1970-01-01
          • 2014-12-25
          • 2013-03-29
          • 2011-06-30
          • 2013-12-26
          相关资源
          最近更新 更多