这两段代码有什么区别?
HttpContext.Current.Session["myvariable"]
Session["myvariable"]
asp.net 4.0和C# 4.0
这两段代码有什么区别?
HttpContext.Current.Session["myvariable"]
Session["myvariable"]
asp.net 4.0和C# 4.0
实际上它们是相同的,因为它们将访问相同的Session数据。
之所以可以在代码后台中调用Session
,是因为ASP.Net页面默认扩展了System.Web.UI.Page
类型。这个类型有一个公共属性Session
。如果你查看Reflector中的代码,你会发现它只是通过自己的Context
属性调用了HttpContext.Current.Session
。
在其他类中,您将无法访问该属性,但只要在Web应用程序的上下文中运行,您可以使用HttpContext.Current.Session
访问会话数据。
在标准场景下,它们是相同的。区别在于第一种语句也适用于静态上下文,例如 WebMethod。
有所区别。第二个(Session
)是许多.NET对象的属性,例如Page
等。因此,在这些对象的构造函数中,您无法访问它。然而,第一个(HttpContext.Current.Session
)总是准备好并可供使用(当然,在请求处理管道中加载会话后)。
没有区别。Page.Session返回HttpContext.Current.Session
话虽如此,我编写了扩展Web应用程序的.dll文件。在这些.dll文件中,没有Session
的概念。在这种情况下,我可以通过引用HttpContext.Current.Session
来访问正在使用我的.dll的Web应用程序的当前会话。
没有区别。它们是同一件事情;第二种形式更短 :)
行为上没有区别。如果您正在使用自定义类中的代码,其中HttpContext不直接可用,并且希望访问会话值,则使用第一行代码,而在页面或控件类中访问时则使用第二行。
以下是 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。
"在内部,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。