问题: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查看到的代码。
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; } } |