2013-02-25 26 views
0

我想在HTTML模块的应用程序启动中执行一些代码。由于Init()被多次触发,是否有可靠的标志告诉我应用程序是否启动?在框架中启动的应用程序标志?

public class Module : IHttpModule 
{ 
    #region IHttpModule Members 

    public void Dispose() 
    { 
     //clean-up code here. 
    } 

    public void Init(HttpApplication context) 
    { 
     //PROCESS ON APPLICATION START EVENT 
     this.OnApplicationStart(context); 
    } 

    #endregion 

    public void OnApplicationStart(HttpApplication context) 
    { 
     if (!application started??) //FRAMEWORK FLAG? 
      //DO SOMETHING 
    } 
} 
+0

我认为你应该使用IHttpHandler而不是IHttpModule。 – Dai 2013-02-25 06:52:30

+0

我正在尝试创建一些可分发的东西,而web.config中的条目是我能想到的最简单且侵入性最小的指令。 – TruMan1 2013-02-25 06:56:42

回答

1

你可以使用一个标志:

public class Module : IHttpModule 
{ 
    private static bool isStarted = false; 
    private static object syncRoot = new object(); 

    public void Dispose() 
    { 
     //clean-up code here. 
    } 

    public void Init(HttpApplication context) 
    { 
     if (!isStarted) 
     { 
      lock (syncRoot) 
      { 
       if (!isStarted) 
       { 
        //PROCESS ON APPLICATION START EVENT 
        this.OnApplicationStart(context); 
        isStarted = true; 
       } 
      } 
     } 
    } 

    public void OnApplicationStart(HttpApplication context) 
    { 
     //DO SOMETHING 
    } 
} 

作为一个更好的选择,使用的HttpModules如果你是靶向.NET 4.0来执行这项任务以后我会用你WebActivator这是一个非常推荐方便的软件包,基于Microsoft.Web.Infrastructure,允许您在单独的库中订阅事件,如Application_Start

例如,简单地把下面的代码在类库:

[assembly: WebActivator.PreApplicationStartMethod(typeof(WebAppInitializer), "Start")] 
namespace FooBar 
{ 
    public static class WebAppInitializer 
    { 
     public static void Start() 
     { 
      // PROCESS ON APPLICATION START EVENT 
     } 
    } 
} 

然后引用在ASP.NET应用程序的类库是所有需要。

你也可以使用这个方便的WebActivator在你的HttpModules中执行依赖注入并自行注册它们,而不需要将它们添加到web.config中。如果您有兴趣,Phil Haack就此主题撰写了nice blog post