在框架中启动的应用程序的标志

本文关键字:应用程序 标志 启动 框架 | 更新日期: 2023-09-27 18:01:00

我正在尝试在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
    }
}

在框架中启动的应用程序的标志

您可以使用一个标志:

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