我正在尝试在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
,它是基于WebActivator
的非常方便的程序包,允许您订阅诸如[ C0]在单独的库中。
例如,只需将以下代码放在类库中:
Microsoft.Web.Infrastructure
然后只需在ASP.NET应用程序中引用类库。
您还可以使用此便捷的WebActivator将依赖项注入到HttpModules中,并自动注册它们,而无需将其添加到web.config。如果您有兴趣,Phil Haack对此主题写了一份Microsoft.Web.Infrastructure
。