如何在ASP.NET应用程序中初始化(6)_ASP教程
推荐:程序员看淘宝,如何用Session保存用户状态网上购物已经成为现在生活不可缺少的一部分。我们上淘宝只是为了消费,今天换一个角度,用程序员的眼光看看淘宝。 如上图: 情况一:当打开一些和账户有关的网页,检测用户没有登录,系统自动会跳转到登录界面。 情况二:当检测到已经有用户登录,页面会自动跳转到目的
前面介绍了4种在ASP.NET执行初始化的方法,你或许想知道它们到底有哪些区别呢?
由于它们都能实现初始化的操作,它们的差别也只有执行的时刻不同而已,我们可以用简单的方法区分它们的调用位置:看异常的调用堆栈信息。
AppInitialize方法异常时的调用堆栈信息:
HttpModule异常时的调用堆栈信息:
PreApplicationStartMethodAttribute异常时的调用堆栈信息:
Global.asax的Application_Start事件处理器的调用方式则不同,ASP.NET采用了反射调用,当异常发生只保留了内部异常,我们看不到调用堆栈(不信的话,自己去试试)。
没关系,既然ASP.NET不告诉我们调用堆栈信息,我们自己也可以去取,请看下面的代码:
- void Application_Start()
- {
- System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace();
- System.IO.File.WriteAllText("h:\\Application_Start_stack.txt", stack.ToString());
- }
再打开文件看一下吧。
说明:Global.asax的Application_Start事件处理器还有几种等效的方法:
- // 这二个方法都可以实现与Application_Start(object sender, EventArgs e)相同的行为。
- void Application_OnStart()
- {
- }
- void Application_Start()
- {
- }
根据以上分析,可以可以得知:
1. AppInitialize和PreApplicationStartMethodAttribute指向的方法被调用的时机发生在ASP.NET创建宿主环境时,属于比较早的时刻。
2. Application_Start和HttpModule的调用时刻要晚一点。
这个结论有用吗?
其实我也感觉意义不大,不过分析它仅仅为了满足我的求知欲和好奇心而已,你是否也有这样的好奇心呢?
如果你仍然好奇想知道这4种方法的执行时机的先后顺序,我也能告诉你:
1. PreApplicationStartMethodAttribute指向的方法。
2. App_Code中的appInitialize方法。
3. Application_Start。
4. HttpModule
再补充一点:在开发环境中,当我们编译网站时,PreApplicationStartMethodAttribute指向的方法可能会被调用,这处决于类库的程序集是否发生了修改。
到底该选择哪种初始化方法?
今天给大家介绍了4种在ASP.NET中执行初始化的方法,或许有些人会想:到底该选择哪种初始化方法呢?
的确,方法越多越让人迷惑。
下面的观点仅代表我个人的建议,你也可以根据自己的喜好来选择。
1. 优先选择Application_Start(虽然IIS的经典模式下需要多写点代码),因为任何人找初始化代码时都会想到那里,便于其他人维护。
2. AppInitialize方法虽然使用简单,但它并不适合于WebApplication项目。
3. PreApplicationStartMethodAttribute只支持ASP.NET 4.0以上版本,且尤其适合于类库的内部初始化。
4. 当以上方法都不可行时,HttpModule将成为最后的救命稻草,它适合所有ASP.NET版本。
分享:ASP.NET七大身份验证方式及解决方案在B/S系统开发中,经常需要使用身份验证。因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域网上公开后,任何人都能够访问你的web应用程序的资源,这样很难保障应用程序安全性。通俗点来说:
- 相关链接:
- 教程说明:
ASP教程-如何在ASP.NET应用程序中初始化(6)。