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

本文关键字:Session net asp 区别 什么 两个 Current HttpContext | 更新日期: 2023-09-27 18:13:06

这两段代码有什么区别

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

asp.net 4.0和c# 4.0

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

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

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

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

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

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

没有区别。页面。会话返回HttpContext.Current.Session

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

来访问使用.dll的web应用程序的当前会话。

没有区别。它们是一样的;第二种形式较短:)

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

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

"HttpApplication的Session属性表现出与HttpContext.Current.Session比例不同的行为。如果可用的话,它们都将返回对同一个httpessionstate实例的引用。它们的不同之处在于,当当前请求没有可用的httpessionstate实例时,它们所做的事情。

不是所有的httphandler都提供会话状态。为此,HttpHandler必须实现一个或两个。]标记接口IRequiresSessionState或IReadOnlySessionState。

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

HttpApplication对Session属性的实现抛出一个HttpException,消息是Session状态在这个上下文中不可用。而不是返回空引用。"

内部,Page。会话指向它只是 HttpContext.Current.Session,但是仍然有两个不同,这取决于它被调用的位置。

页面。Session只能从System.Web.UI.Page继承的类中访问,当从WebMethod访问时,它会抛出HttpException。
Where as HttpContext.Current.Session可以从任何地方访问,只要你在web应用程序的上下文中运行。


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

这是因为GetData已经从不同的线程调用,所以HttpContext。当前为空,HttpContext.Current.Session将抛出空引用异常,但是Page. session将抛出空引用异常。Session仍然会被附加到page对象中,所以page方法GetData可以访问page .Session.