如何在ASP.NET应用程序中初始化(4)_ASP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:程序员看淘宝,如何用Session保存用户状态
网上购物已经成为现在生活不可缺少的一部分。我们上淘宝只是为了消费,今天换一个角度,用程序员的眼光看看淘宝。 如上图: 情况一:当打开一些和账户有关的网页,检测用户没有登录,系统自动会跳转到登录界面。 情况二:当检测到已经有用户登录,页面会自动跳转到目的

ASP.NET允许我们在App_Code中的任何一个类型定义一个AppInitialize方法,用它也能执行初始化的任务。

  1. public class Class1  
  2. {  
  3.     public static void appInitialize()  
  4.     {  
  5.         AppInitializer.Init();          
  6.     }  
  7. }  

如果我此时再次运行示例程序(已注释掉Global.asax中的代码),会看到以下显示:

如何在ASP.NET应用程序中初始化

显然,我们期望的初始化代码确实被调用了。

这个AppInitialize方法有什么限制呢?

我们还是来看一下ASP.NET的源代码吧:

  1. internal class BuildResultMainCodeAssembly : BuildResultCompiledAssembly  
  2. {  
  3.     private MethodInfo FindAppInitializeMethod(Type t)  
  4.     {  
  5.         return t.GetMethod("AppInitialize",   
  6.             BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,   
  7.             null, new Type[0], null);  
  8.     }  

根据代码我们可以发现AppInitialize方法的特点有:

1. 必须是一个公开的静态方法:BindingFlags.Public | BindingFlags.Static

2. 方法名不区分大小写:BindingFlags.IgnoreCase

3. 方法不允许有传入参数:new Type[0]

HttpModule也能执行初始化的任务

由于HttpModule总是会在ASP.NET管线中被调用,所以,我们还可以用它来完成初始化的操作。

  1. public class InitAppModule : IHttpModule  
  2. {  
  3.     public void Init(HttpApplication context)  
  4.     {  
  5.          //注意:Init事件可能被多次调用,所以这个方法会被多次调用。  
  6.  
  7.         AppInitializer.Init();  
  8.     }  

正如代码注释所说的那样,这种调用代码是不对的,除非你能接受初始化代码被多次调用!

所以,我们应该按单例模式的思路来改写代码:

  1. private static readonly object s_lock = new object();  
  2. private static bool s_initOK;  
  3.  
  4. public void Init(HttpApplication context)  
  5. {  
  6.     lock( s_lock ) {  
  7.         if( s_initOK == false ) {  
  8.             //保证初始化代码只执行一次。  
  9.  
  10.             AppInitializer.Init();  
  11.             s_initOK = true;  
  12.         }  
  13.     }  
  14. }  

如果你希望代码简单一点,还可以这样实现:

  1. public class InitAppModule : IHttpModule  
  2. {  
  3.     static InitAppModule()  
  4.     {  
  5.         AppInitializer.Init();  
  6.     }  
  7.     public void Init(HttpApplication context)  
  8.     {  
  9.         // 留个空方法,  
  10.         // ASP.NET会调用这个方法,最后能触发静态方法的调用。  
  11.     }  

ASP.NET 4.0新增的初始化方法

为了让一些类库能自动执行一些初始化,ASP.NET提供了一种新方法,允许为程序集指定一个PreApplicationStartMethodAttribute

为了演示这种用法,我将前面的示例(VS2008开发)移到一个类库中(用VS2012开发)并设置类库的命名空间为InitClassLibrary1。

分享:ASP.NET七大身份验证方式及解决方案
在B/S系统开发中,经常需要使用身份验证。因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域网上公开后,任何人都能够访问你的web应用程序的资源,这样很难保障应用程序安全性。通俗点来说:

来源:模板无忧//所属分类:ASP教程/更新时间:2015-06-11
相关ASP教程