0

HTML モジュールのアプリケーション開始でいくつかのコードを実行しようとしています。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
    }
}
4

1 に答える 1

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
    }
}

.NET 4.0以降をターゲットにしている場合に、HttpModulesを使用してこのタスクを実行するより良い代替手段として、別のライブラリなどのイベントをサブスクライブできるようにすることにWebActivator基づいた非常に便利なパッケージを使用することをお勧めします。Microsoft.Web.InfrastructureApplication_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を使用して、HttpModuleへの依存性注入を実行し、web.configに追加しなくても自己登録することもできます。nice blog post興味があれば、PhilHaackがこのトピックについて書いています。

于 2013-02-25T07:08:43.463 に答える