asp.net – Session和HttpContext.Current.Session之间的区别

Session和HttpContext.Current.Session对象有什么区别?
最佳答案
这里有点迟,但这里是我刚刚发现的东西。

@Phillipe Leybaert和@CSharpAtl都不正确。 HttpApplication的Session属性呈现不同于属性HttpContext.Current.Session的行为。如果一个HttpSessionState实例可用,它们将返回对同一个HttpSessionState实例的引用。当HttpSessionState的实例对当前请求不可用时,它们的作用不同。

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

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

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

不实现会话的HttpHandlers的一些示例是常规静态资源的默认处理程序,例如图像和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;
  }
}

转载注明原文:asp.net – Session和HttpContext.Current.Session之间的区别 - 代码日志