这两个HttpContext.Current.Session和Session - asp.net 4.0有什么区别

时间:2011-10-31 14:10:21

标签: c# asp.net session session-variables httpcontext

这两段代码之间有什么区别。

HttpContext.Current.Session["myvariable"]
Session["myvariable"]

asp.net 4.0和C#4.0

8 个答案:

答案 0 :(得分:25)

他们有效相同,因为他们将访问相同的会话数据。

您可以在代码隐藏中调用Session的原因是因为ASP.Net页面默认扩展System.Web.UI.Page类型。这有一个Session公共财产。如果您在Reflector中查看此代码,您可以看到它只调用HttpContext.Current.Session本身(通过其自己的Context属性)。

在其他类中,您将无权访问该属性,但只要您在Web应用程序的上下文中运行,就可以使用HttpContext.Current.Session来访问会话数据。

答案 1 :(得分:8)

在标准情景中,它们是相同的。不同之处在于第一个语句也可以在静态上下文中工作,例如WebMethod。

答案 2 :(得分:5)

有区别。第二个(Session)是许多.NET对象的属性,例如Page。因此,您无法在这些对象的构造函数中访问它。但是,第一个(HttpContext.Current.Session)随时可以使用(当然,在会话加载到请求处理管道中之后)。

答案 3 :(得分:3)

没有区别。 Page.Session返回HttpContext.Current.Session

话虽如此,我写了.dll作为Web应用程序的扩展。这些.dll没有Session的概念。在这些情况下,我可以通过引用HttpContext.Current.Session

来访问使用我的.dll的Web应用程序的当前会话

答案 4 :(得分:2)

没有区别。他们是一样的东西;第二种形式更短:)

答案 5 :(得分:2)

行为没有区别。如果您在自定义类中使用HttpContext不能直接使用的代码并且想要访问会话值而不是我们使用第一行代码,而在访问Page或控件类时使用第二行。

答案 6 :(得分:1)

Nicholas Carey的另一个非常彻底的回答https://stackoverflow.com/a/6021261/365017

“HttpApplication的Session属性表现出与比例HttpContext.Current.Session不同的行为。如果一个HttpSessionState实例可用,它们都将返回对同一个HttpSessionState实例的引用。它们在没有实例的时候会有所不同。 HttpSessionState可用于当前请求。

并非所有HttpHandler都提供会话状态。为此,HttpHandler必须实现[一个或两个?]标记接口IRequiresSessionState或IReadOnlySessionState。

如果没有可用的会话,HttpContext.Current.Session只返回null。

HttpApplication的Session属性实现会抛出一个HttpException,并在此上下文中提供消息Session state。而不是返回一个空引用。“

答案 7 :(得分:0)

在内部,Page.Session仅指向它是HttpContext.Current.Session,但根据调用位置的不同,仍然存在两个差异。

Page.Session只能从从System.Web.UI.Page继承的类访问,从WebMethod访问时它将抛出HttpException。
HttpContext.Current.Session可以从任何地方访问,只要您正在Web应用程序的上下文中运行。


您可以访问Page.Session但不能访问HttpContext.Current.Session的其他重要区别:

如果您的页面中有一个名为GetData的方法(从System.Web.UI.Page继承),则该方法是与其他页面方法在不同线程中并发执行的GetData方法可以访问Page.Seession,但不能访问HttpContext.Current.Session。

因为从不同的线程调用了GetData,所以HttpContext.Current为null,而HttpContext.Current.Session将抛出空引用异常,但是Page.Session仍将与页面对象一起附加,因此页面方法GetData可以访问Page.Session。