这两个HttpContext.Current.Session 和 Session有什么不同呢? - ASP.NET 4.0

25

这两段代码有什么区别?

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

asp.net 4.0和C# 4.0

8个回答

28

实际上它们是相同的,因为它们将访问相同的Session数据。

之所以可以在代码后台中调用Session,是因为ASP.Net页面默认扩展了System.Web.UI.Page类型。这个类型有一个公共属性Session。如果你查看Reflector中的代码,你会发现它只是通过自己的Context属性调用了HttpContext.Current.Session

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


6
返回的属性对象是相同的,但是如果会话不存在,HttpContect.Current.Session会返回null,而Page.Session会抛出一个HttpException异常。 - Polymorphix

12

在标准场景下,它们是相同的。区别在于第一种语句也适用于静态上下文,例如 WebMethod。


2
这是最容易理解的区别。 - Sangram Nandkhile

5

有所区别。第二个(Session)是许多.NET对象的属性,例如Page等。因此,在这些对象的构造函数中,您无法访问它。然而,第一个(HttpContext.Current.Session)总是准备好并可供使用(当然,在请求处理管道中加载会话后)。


4

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

话虽如此,我编写了扩展Web应用程序的.dll文件。在这些.dll文件中,没有Session的概念。在这种情况下,我可以通过引用HttpContext.Current.Session来访问正在使用我的.dll的Web应用程序的当前会话。


2

没有区别。它们是同一件事情;第二种形式更短 :)


2

行为上没有区别。如果您正在使用自定义类中的代码,其中HttpContext不直接可用,并且希望访问会话值,则使用第一行代码,而在页面或控件类中访问时则使用第二行。


2

以下是 Nicholas Carey 给出的详细答案 https://dev59.com/EHNA5IYBdhLWcg3wfd8m#6021261

"HttpApplication 的 Session 属性表现出与 HttpContext.Current.Session 不同的行为。如果有 HttpSessionState 实例可用,它们都将返回对该实例的引用。当当前请求没有 HttpSessionState 实例时,它们的操作不同。

并非所有的 HttpHandler 都提供会话状态。要做到这一点,HttpHandler 必须实现 IRequiresSessionState 或 IReadOnlySessionState 中的 [一个或两个?] 标记接口中的一个或两个。

如果没有可用的会话,则 HttpContext.Current.Session 简单地返回 null 。

与返回 null 引用不同,HttpApplication 的 Session 属性实现会抛出一个带有消息“在此上下文中不可用会话状态”的 HttpException。

"


0

在内部,Page.Session 只指向 HttpContext.Current.Session,但是根据调用它的位置仍然有两个不同之处。

只能从继承自 System.Web.UI.Page 的类中访问 Page.Session,并且从 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 为空,HttpContext.Current.Session 将引发空引用异常,但 Page.Session 仍将附加到页面对象,因此页面方法 GetData 可以访问 Page.Session。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接