2013-02-25 64 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