如何在 HttpModule 中利用或模仿应用程序 OnStart?

发布于 2024-08-28 01:32:56 字数 697 浏览 8 评论 0原文

我们正在尝试从许多 Web 应用程序中删除 global.asax,转而使用公共代码库中的 HttpModule。这对于许多应用程序事件(例如 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 的情况下调用某些应用程序开始逻辑的最佳方法是什么?

We are trying to remove the global.asax from our many web applications in favor of HttpModules that are in a common code base. This works really well for many application events such as BeginRequest and PostAuthentication, but there is no Application Start event exposed in the HttpModule.

I can think of a couple of smelly ways to overcome this deficit. For example, I can probably do this:

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 ...
}

But this just doesn't smell well to me.

What is the best way to invoke some application begin logic without having a global.asax?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱人如己 2024-09-04 01:32:56

只需在 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 即可。

Just keep a static bool in the 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;
    }
}

Then have any method that needs the application to have started just call EnsureStarted.

萌梦深 2024-09-04 01:32:56

HttpModules 和 HttpHandlers 将在每个请求上执行,而 Global.asax App Start 事件是在应用程序启动时执行,因此仅执行一次。

您可以创建一个通用的 global.asax ,它将加载具有特定接口的所有程序集,然后放入您想要为该特定应用程序执行的 dll。或者甚至将它们注册到您的 web.config 中,并让您的通用 global.asax 读取密钥,然后加载并执行您想要的代码。

我认为这比将应用程序一次代码放入模块中并检查状态变量更好。

HttpModules and HttpHandlers will execute on every single request, while the Global.asax App Start event is when the application starts, thus only once.

You could make a general global.asax which will load all assemblies with a specific interface, and then drop in the dll's you want executed for that specific application. Or even register them in your web.config, and have your general global.asax read the keys, and then load and execute the code you want.

I think this is better than putting app once code in a module and checking on a state variable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文