首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

Session与HttpContext.Current.Session到底有什么区别呢?该如何解决

2013-07-16 
Session与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.Current.Session与Page.Session

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

(查找网上资料)
[解决办法]
参考
[解决办法]
两个是相同的对象
HttpContext指的是当前请求的HttpHandler实例,而Page就是这个实例,所以访问上没有区别,主要用于一些场景无法获取Page对象,只能用上下文来获取请求实例的情况
[解决办法]
页面当中的Session相当于 this.Session

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


[解决办法]
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;
    }
}


[解决办法]
楼主不如也装个 reflector ,看看那个Session从哪来的,不就明白了。

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



正解!

热点排行