会话和HttpContext.Current.Session之间的区别
Session和HttpContext.Current.Session对象有什么区别?
这里有点晚,但是我刚刚发现了一些东西。
@Phillipe Leybaert和@CSharpAtl都不正确。 HttpApplication
的Session
属性performance出与属性HttpContext.Current.Session
不同的行为。 如果可用的话,它们都会返回对同一个HttpSessionState
实例的引用。 它们在当前请求没有可用的HttpSessionState实例时所做的不同。
并不是所有的HttpHandler
提供会话状态。 为此, HttpHandler
必须实现标记接口IRequiresSessionState
或IReadOnlySessionState
一个或两个。
如果没有可用的会话, HttpContext.Current.Session
简单地返回null
。
Session属性的HttpApplication
的实现抛出一个HttpException
,消息Session state is not available in this context.
而不是返回一个null
引用。
不执行会话的HttpHandler的一些示例是通常静态资源(如图像和CSS文件)的默认处理程序。 在这种情况下(如在global.asax
事件处理程序中),对HttpApplication
的Session
属性的任何引用都将导致引发HttpException。
不用说,意外的HttpException提供了一个WTF? 如果你不期待的话。
HttpApplication
类的Session
属性就这样实现了(来自Reflector):
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public HttpSessionState Session { get { HttpSessionState session = null; if (this._session != null) { session = this._session; } else if (this._context != null) { session = this._context.Session; } if (session == null) { throw new HttpException(SR.GetString("Session_not_available")); } return session; } }
没有区别。
Page.Session的getter返回上下文会话。
Nothing Session只是指向当前的HttpContext会话。