问题:HttpContext.Current.Session;结果:Session与HttpContext.Current.Session到底有什么区别呢?

我在做练习的时候遇到了这样一个问题,在母版页页面中写入登录和密码修改的js代码,在登录的方法中写 入 HttpContext.Current.Session.Add("UserPwd", dtUser.Rows[0] [1].ToString()),以便让这个session在做密码修改的时候和用户输入的密码做比较。但是在母版页的js代码中写入 Session["UserPwd"].ToString()总是报错,错误提示是:未将引用对象实例化。在母版页的page_load()方法中写入 string ss=Session["UserPwd"].ToString()是可以得到密码的。

        在同事的帮助下,找到了解决方法,就是在js方法中将Session["UserPwd"].ToString()改成 HttpContext.Current.Session["UserPwd"].ToString()就可以得到密码了。但此时page_load() 方法下的string ss=Session["UserPwd"].ToString()又开始报错。所以新的问题又出来了,Session与 HttpContext.Current.Session到底有什么区别呢?以下是我在MSDN中找到的结果:

        Session 属性提供对 HttpSessionState 类的属性和方法的编程访问。由于 ASP.NET 页包含 对 System.Web 命名空间(含有 HttpContext 类)的默认引用,因此在 .aspx 页上可以引用 HttpContext 的成 员,而不需要使用对 HttpContext 的完全限定类引用。例如,可使用 Session("SessionVariable1") 获取或设置会 话状态变量 SessionVariable1 的值。但是,如果要从 ASP.NET 代码隐藏模块中使用 HttpResponse 的成员,则必须 在模块中包括对 System.Web 命名空间的引用,同时还要包括对当前活动的请求/响应上下文以及要使用的 System.Web 中的类的完全限 定引用。例如,在代码隐藏页中,必须指定完全限定名 称 HttpContext.Current.Session("SessionVariable1")。 

        如果未启用会话状态,则无法设置或获取会话状态值。若要为应用程序配置会话状态设置,请在 Web.config 文件中设 置 sessionState 元素的 mode 属性。启用会话状态后,如果请求一个会话状态变量中不存在的值,则会返回 null。

        难道是和这个有关系么?如果说二者没有区别,为什么在将Session["UserPwd"].ToString()改成 HttpContext.Current.Session["UserPwd"].ToString()之后,原本正确可以得到结果的 string ss=Session["UserPwd"].ToString()报错了呢?还希望在这个平台上得到大家的帮助!谢谢

 

 

两个是相同的对象
HttpContext指的是当前请求的HttpHandler实例,而Page就是这个实例,所以访问上没有区别,主要用于一些场景无法获取Page对象,只能用上下文来获取请求实例的情况

 

页面当中的Session相当于 this.Session

而在不属于页面的时候(比如你所说的母版页,它可不是继承自System.Web.UI.Page;或者是BLL层)就只能通过上下文来获得Session了

 

 

Page的 Context属性跟HttpContext.Current引用相等的
这是用reflector查看到的代码。

C# code?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
protected internal override HttpContext Context
{
    [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    get
    {
        if (this._context == null)
        {
            this._context = HttpContext.Current;
        }
        return this._context;
    }
}
  
public virtual HttpSessionState Session
{
    get
    {
        if (!this._sessionRetrieved)
        {
            this._sessionRetrieved = true;
            try
            {
                this._session = this.Context.Session;
            }
            catch
            {
            }
        }
        if (this._session == null)
        {
            throw new HttpException(SR.GetString("Session_not_enabled"));
        }
        return this._session;
    }
}
posted @ 2015-12-22 10:17  longphui  Views(1543)  Comments(0Edit  收藏  举报