申请标志是在框架中开始的吗?

时间:2013-02-25 06:46:11

标签: c# asp.net .net httphandler

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

1 个答案:

答案 0 :(得分: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