我们正在尝试从许多Web应用程序中删除global.asax,转而使用公共代码库中的HttpModule。这对于许多应用程序事件(例如BeginRequest和PostAuthentication)非常有效,但是在HttpModule中没有公开Application Start事件。
我可以想出几种有效的方法来克服这种不足。例如,我可以这样做:
protected virtual void BeginRequest(object sender, EventArgs e)
{
Log.Debug("Entered BeginRequest...");
var app = HttpContext.Current.Application;
var hasBeenSet app["HasBeenExecuted"] == null ? false : true;
if(!hasBeenSet)
{
app.Lock();
// ... do app level code
app.Add("HasBeenExecuted", true);
app.Unlock();
}
// do regular begin request stuff ...
}
但这对我来说并不好闻。
在没有global.asax的情况下调用某些应用程序开始逻辑的最佳方法是什么?
答案 0 :(得分:1)
在HttpModule
:
private static bool _hasApplicationStarted = false;
private static object _locker = new object();
private void EnsureStarted()
{
if (_hasApplicationStarted) return;
lock (_locker)
{
if (_hasApplicationStarted) return;
// perform application startup here
_hasApplicationStarted = true;
}
}
然后让任何需要应用程序启动的方法只需调用EnsureStarted
。
答案 1 :(得分:0)
HttpModules和HttpHandlers将在每个请求上执行,而Global.asax App Start事件是在应用程序启动时,因此只有一次。
你可以制作一个通用的global.asax,它将加载具有特定接口的所有程序集,然后放入你想要为该特定应用程序执行的dll。或者甚至在web.config中注册它们,让你的通用global.asax读取密钥,然后加载并执行你想要的代码。
我认为这比将app代码放入模块并检查状态变量更好。