如何在ASP.NET应用程序中初始化(4)_ASP教程
推荐:程序员看淘宝,如何用Session保存用户状态网上购物已经成为现在生活不可缺少的一部分。我们上淘宝只是为了消费,今天换一个角度,用程序员的眼光看看淘宝。 如上图: 情况一:当打开一些和账户有关的网页,检测用户没有登录,系统自动会跳转到登录界面。 情况二:当检测到已经有用户登录,页面会自动跳转到目的
ASP.NET允许我们在App_Code中的任何一个类型定义一个AppInitialize方法,用它也能执行初始化的任务。
- public class Class1
- {
- public static void appInitialize()
- {
- AppInitializer.Init();
- }
- }
如果我此时再次运行示例程序(已注释掉Global.asax中的代码),会看到以下显示:
显然,我们期望的初始化代码确实被调用了。
这个AppInitialize方法有什么限制呢?
我们还是来看一下ASP.NET的源代码吧:
- internal class BuildResultMainCodeAssembly : BuildResultCompiledAssembly
- {
- private MethodInfo FindAppInitializeMethod(Type t)
- {
- return t.GetMethod("AppInitialize",
- BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,
- null, new Type[0], null);
- }
根据代码我们可以发现AppInitialize方法的特点有:
1. 必须是一个公开的静态方法:BindingFlags.Public | BindingFlags.Static
2. 方法名不区分大小写:BindingFlags.IgnoreCase
3. 方法不允许有传入参数:new Type[0]
HttpModule也能执行初始化的任务
由于HttpModule总是会在ASP.NET管线中被调用,所以,我们还可以用它来完成初始化的操作。
- public class InitAppModule : IHttpModule
- {
- public void Init(HttpApplication context)
- {
- //注意:Init事件可能被多次调用,所以这个方法会被多次调用。
- AppInitializer.Init();
- }
正如代码注释所说的那样,这种调用代码是不对的,除非你能接受初始化代码被多次调用!
所以,我们应该按单例模式的思路来改写代码:
- private static readonly object s_lock = new object();
- private static bool s_initOK;
- public void Init(HttpApplication context)
- {
- lock( s_lock ) {
- if( s_initOK == false ) {
- //保证初始化代码只执行一次。
- AppInitializer.Init();
- s_initOK = true;
- }
- }
- }
如果你希望代码简单一点,还可以这样实现:
- public class InitAppModule : IHttpModule
- {
- static InitAppModule()
- {
- AppInitializer.Init();
- }
- public void Init(HttpApplication context)
- {
- // 留个空方法,
- // ASP.NET会调用这个方法,最后能触发静态方法的调用。
- }
ASP.NET 4.0新增的初始化方法
为了让一些类库能自动执行一些初始化,ASP.NET提供了一种新方法,允许为程序集指定一个PreApplicationStartMethodAttribute
为了演示这种用法,我将前面的示例(VS2008开发)移到一个类库中(用VS2012开发)并设置类库的命名空间为InitClassLibrary1。
分享:ASP.NET七大身份验证方式及解决方案在B/S系统开发中,经常需要使用身份验证。因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域网上公开后,任何人都能够访问你的web应用程序的资源,这样很难保障应用程序安全性。通俗点来说:
- 相关链接:
- 教程说明:
ASP教程-如何在ASP.NET应用程序中初始化(4)。