如何在HttpModule中使用或模仿Application OnStart?

时间:2010-04-02 19:21:45

标签: asp.net global-asax httprequest

我们正在尝试从许多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的情况下调用某些应用程序开始逻辑的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

HttpModule

中保留一个静态bool
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代码放入模块并检查状态变量更好。