zoukankan      html  css  js  c++  java
  • 问题: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;
        }
    }
  • 相关阅读:
    keeprunning1的使用说明
    团队冲刺第十五天
    团队冲刺第十四天
    团队第一阶段冲刺评价
    团队第一阶段成果展示
    团队冲刺第十三天
    团队冲刺第十二天
    团队冲刺第十一天
    团队冲刺第十天
    团队冲刺第九天
  • 原文地址:https://www.cnblogs.com/longphui/p/5065785.html
Copyright © 2011-2022 走看看