转:System.Web.UI.Page类的构造函数的执行时机
2009-09-26 18:30
232 查看
这篇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
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
相关文章推荐
- System.Web.UI.Page类的构造函数的执行时机
- asp.net Chartr控件异常: System.Web.HttpException: 为 ChartImg.axd 执行子请求时出错(已解决)
- 在QT环境下,实例分析构造函数与析构函数的执行时机
- page类的构造函数执行时机
- System.Web.UI.Page事件执行顺序
- 静态构造函数的执行时机
- 类型构造器(静态构造函数)的执行时机你知道多少?
- Fragment执行SystemWebView,CordovaPlugin插件中onActivityResult()不执行
- 临时对象构造函数和析构函数的执行时机
- System.Threading.Timer 定制Web服务器定时器执行事务!
- 关于静态构造函数执行时机
- .net System.Web.HttpContext.Current.Session 获取值出错(在Page继承类的构造函数中出错)
- Java静态变量初始化及构造函数的执行顺序与执行时机分析
- 无法识别的配置节 system.web/protocols
- 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
- php无法执行system()的shell脚本但是Linux终端可以执行
- System.InvalidOperationException: 集合已修改;可能无法执行枚举操作。
- 构造函数的执行
- 用 System.Web.Mail.SmtpMail 发信出现异常
- .NET System.Timers.Timer的原理和使用(开发定时执行程序)