[转]System.Web.UI.Page类的构造函数的执行时机

这篇Blog来自一位同事和我的一次关于公司一个项目中的一个错误的讨论。错误非常简单,就是当在一个页面的构造函数中使用类似:

Session[“aaa”] = “bbb”;

的时候,就会抛出异常,说系统中Session没有被enable,所以不能使用(当然实际情况是肯定被enable了)。问题所在和解决方法也很快被找到了,在构造函数中不能使用Session的,将这个移到Page_Init中就OK了。

这个错误的根本原因应该是在页面的构造函数被调用时,ASP.NET引擎中负责处理Session的SessionStateModule中相应初始化Session的代码还没有被执行,所以才导致了那时不能访问当前上下文的Session信息。

SessionStateModule在其Init方法中,是在HttpApplication的AcquireRequestState事件(更确切说,应该是通过使用AddOnAcquireRequestStateAsync()方法,来进行异步的事件处理)上注册了相应的方法,来完成初始化HttpSessionState对象,并将其赋值给当前的HttpContext的Session属性,而在HttpApplication的AcquireRequestState事件被调用的时候,页面对象已经被创建了,就是说,页面的构造函数的执行是在AcquireRequestState事件被调用之前,所以在页面构造函数中访问Session当然会引发相应的异常。

HttpApplication的确切执行顺序是:

BeginRequest -> AuthenticateRequest -> AuthorizeRequest -> ResolveRequestCache -> 构建页面(在这里页面构造函数被调用) -> AcquireRequestState(这里才初始化当前上下文的Session) -> PreRequestHandlerExecute -> 进入页面执行生命周期(开始Page_Init) -> PostRequestHandlerExecute -> ReleaseRequestState -> UpdateRequestCache -> EndRequest
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是我的代码,using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class index : System.Web.UI.Page { //先新建一个Linq的操作对象 StudentDataDataContext stdDb = new StudentDataDataContext (); protected void Page_Load(object sender, EventArgs e) { //给下拉框添加年龄选项 for(int i = 15; i < 22; i++) { ListItem item = new ListItem(); item.Text = i.ToString(); item.Value = i.ToString(); DropDownList1.Items.Add(item); } } protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e) { } protected void GridView2_SelectedIndexChanged(object sender, EventArgs e) { } //添加按钮的处理代码 protected void Button1_Click(object sender, EventArgs e) { //用异常捕获语句 try { //新建student的信息存储对象 Student student = new Student(); //为实体对象指定需要收集的信息 student.SID = this.TextBox1.Text.Trim(); student.SName = this.TextBox2.Text.Trim(); student.Age = Convert.ToInt32(this.DropDownList1.SelectedValue); //添加到数据库中 stdDb.Student.InsertOnSubmit(student); //提交修改 stdDb.SubmitChanges(); //提示添加成功并返回信息给页面 Button5_Click(sender, e); this.TextBox3.Text = "添加成功!"; } catch (Exception es) { this.TextBox3.Text = "添加失败!错误原因是"+es.Message; } } //显示全部数据的按钮点击槽函数 protected void Button5_Click(object sender, EventArgs e) { //1.先将查询的结果存储在结果对象中 var result = from Student in stdDb.Student orderby Student.SID select Student; //2.将数据源指定给sqlDataSource控件 this.GridView2.DataSourceID = ""; this.GridView2.DataSource = result; //3.更新表格 this.GridView2.DataBind(); } }请帮我查看为什么报错
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值