Session与HttpContext.Current.Session到底有什么区别呢?

笨妞妞 2011-03-17 07:10:07
我在做练习的时候遇到了这样一个问题,在母版页页面中写入登录和密码修改的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()报错了呢?还希望在这个平台上得到大家的帮助!谢谢
...全文
9498 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
y3001181027 2013-07-11
  • 打赏
  • 举报
回复
前面有说原因了,现说解决方法: using System.Web.SessionState; public class PubLib : System.Web.UI.Page, IRequiresSessionState 注意,在你的类后面加"IRequiresSessionState" 就可以与PAGE中的使用同一个SESSION值
thsgar 2013-05-21
  • 打赏
  • 举报
回复
我也是在迷惑这个问题,按说两者一样的啊,但是我定义了System.Web.HttpContext.Current.Session["dt2"] = datatable2;和System.Web.HttpContext.Current.Session["dt1"] = datatable1;这两个session在两个不同的方法里,但是我引用的时候二者却是相同的,我表示很郁闷啊!
  • 打赏
  • 举报
回复
这个问题没有解决,真是遗憾至极
haomengtao221 2011-05-28
  • 打赏
  • 举报
回复
很和韩
  • 打赏
  • 举报
回复
这个问题没有解决,真是遗憾至极
子夜__ 2011-03-18
  • 打赏
  • 举报
回复
海角的孤星 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leileiskzx 的回复:]

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

学习
  • 打赏
  • 举报
回复
不太懂,我是进来看看的
paual779 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leileiskzx 的回复:]

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

正解!
种草德鲁伊 2011-03-18
  • 打赏
  • 举报
回复
楼主不如也装个 reflector ,看看那个Session从哪来的,不就明白了。

MasterPage 其实是 UserControl 的派生类
笨妞妞 2011-03-18
  • 打赏
  • 举报
回复
To 高歌:

谢谢你的回复!你说在母版页要通过上下文才能获取到Session,可以下这段代码也是从母版页中写的,其中的Session是可以取到值的。
public partial class MasterPageApplication_ParentPage : System.Web.UI.MasterPage
{
public string strCon = System.Configuration.ConfigurationManager.AppSettings["ConnStr"];

protected void Page_Load(object sender, EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(MasterPageApplication_ParentPage));
incon.Value = this.Application["ConnStr"].ToString();

if (!IsPostBack)
{
#region 初始化
if (Session["LoginUserNm"] != null)
{
UserName.Text = Session["LoginUserNm"].ToString();
divuserid.Style["display"] = "none";
divpassword.Style["display"] = "none";
divusername.Style["display"] = "";
btnlogin.Style["display"] = "none";
btnlogout.Style["display"] = "";
btnmodify.Style["display"] = "";
}
else
{
divuserid.Style["display"] = "";
divpassword.Style["display"] = "";
divusername.Style["display"] = "none";
btnlogin.Style["display"] = "";
btnlogout.Style["display"] = "none";
btnmodify.Style["display"] = "none";
}
#endregion
}
}
}
种草德鲁伊 2011-03-18
  • 打赏
  • 举报
回复
Page的 Context属性跟HttpContext.Current引用相等的
这是用reflector查看到的代码。



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;
}
}

amandag 2011-03-18
  • 打赏
  • 举报
回复
页面当中的Session相当于 this.Session

而在不属于页面的时候(比如你所说的母版页,它可不是继承自System.Web.UI.Page;或者是BLL层)就只能通过上下文来获得Session了
笨妞妞 2011-03-18
  • 打赏
  • 举报
回复
To leileiskzx:

如果二者没有区别,为什么将Session[].ToString()改为HttpContext.Current.Session[].ToString()就可以获取到值,在这种情况下,原本在page_load()方法里的Session[].ToString()却报错了呢?
笨妞妞 2011-03-18
  • 打赏
  • 举报
回复
子夜:
看了你的回复。我的问题又出来了,“根据网友的介绍的HttpContext.Current.Session
这个通常用在单独的类里。Page.Session一般是页面的后置类里用。”这是摘自你提供网页上的一段话,请问什么叫后置类?
夜闻香 2011-03-18
  • 打赏
  • 举报
回复
两个是相同的对象
HttpContext指的是当前请求的HttpHandler实例,而Page就是这个实例,所以访问上没有区别,主要用于一些场景无法获取Page对象,只能用上下文来获取请求实例的情况
海角的孤星 2011-03-17
  • 打赏
  • 举报
回复
HttpContext.Current.Session与Page.Session

因为Session是在HttpApplication的AcquireRequestState事件后才有的,而Page类(或其他HttpHandler)的对象是在此之前生成的,看一下HttpApplication的事件次序

(查找网上资料)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧