代码之家  ›  专栏  ›  技术社区  ›  Matt

当前的httpContext.current是如何工作的,它提供了静态变量的上下文相关状态?

  •  2
  • Matt  · 技术社区  · 16 年前

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

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

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

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Philip Rieck    16 年前

    基本上,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.current用于对httpContext的新实例的每个请求。该setter将实例存储在线程静态存储中。然后getter将当前线程的实例从该存储中拉出。

    需要注意的关键是,静态属性或方法不仅仅是全局字段,它还可以使用当前线程之类的东西来更改它执行的操作或返回的内容。

    **实际上,httpcontext.current委托给contextbase,contextbase委托给callcontext,callcontext最终在线程上使用方法,但其概念是相同的。

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

        2
  •  1
  •   Brian Mains    16 年前

    好吧,它包装了底层的请求和管道对象;静态对象在回发(跨所有请求)中保留了自己,这是我必须学习的一个痛苦的课程…但是无论如何,对象不会被保留,但是公开底层服务和管道的静态对象可以正常工作。

    我的意思是,httpContext.current可能没有得到保留,因为它实际上只是在.NET框架中公开可用的服务。这些服务对于请求/用户可能是唯一的,因为由被访问的服务来决定(会话具有内置于服务的内容,使其对用户是唯一的)。

    小精灵。

        3
  •  0
  •   AJ.    16 年前

    current是线程特定的,因此看起来很不稳定(可以把它想象成线程上的psuedo扩展方法),session是与应用程序(或应用程序线程)关联的静态对象。在短上下文中,current将使当前线程相互关联。

    推荐文章