代码之家  ›  专栏  ›  技术社区  ›  Sailing Judo

如何在httpmodule中使用或模拟应用程序启动?

  •  1
  • Sailing Judo  · 技术社区  · 14 年前

    我们正试图从我们的许多Web应用程序中删除global.asax,以支持通用代码库中的httpmodules。这对于许多应用程序事件(如BeginRequest和PostAuthentication)都非常有效,但在httpModule中没有公开任何应用程序启动事件。

    我可以想出一些方法来克服这个赤字。例如,我可以这样做:

    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 回复  |  直到 14 年前
        1
  •  1
  •   John Saunders Tony    14 年前

    只需保持一个静态的胸部在 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 .

        2
  •  0
  •   Mikael Svenson    14 年前

    httpmodules和httphandlers将对每个请求执行,而global.asax app start事件是在应用程序启动时执行的,因此只有一次。

    您可以生成一个通用的global.asax,它将加载具有特定接口的所有程序集,然后放入要为该特定应用程序执行的dll。或者甚至在web.config中注册它们,让general global.asax读取这些键,然后加载并执行所需的代码。

    我认为这比将app-once代码放入模块并检查状态变量要好。