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.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。nice blog post如果你有兴趣,Phil Haack 写了一篇关于这个主题的文章。

于 2013-02-25T07:08:43.463 回答