在HttpModule中挂钩到Application_Start

我正在实现一个简单的HttpModule,我想在Web应用程序启动时运行一些代码。 但我很惊讶地发现我通常从Global.asax使用的Application_Start事件不能从HttpModule获得。 这是正确的,还是我在这里遗漏了什么?

如何从HttpModule挂钩到Application_Start事件?

更新:
我使用Init事件来简单解决这个问题,但它对我来说仍然有点滑稽。

您可以使用HttpModule来处理应用程序启动事件

与其他只写/相信他们阅读的内容相反,我已经完成了自己的工作并发现可以使用HTTP模块处理应用程序启动。 这真的是一个黑客,但它可靠地工作。 它绝对不是某人应该避免的东西,因为我也在MS模块中看到它(即Sharepoint 2010 SPRequestModule )我的这篇博文( 编写一个处理Application_Start事件的自定义IHttpModule )将为您提供您需要知道的所有信息对这个。 我自己完成了它,它只是有效。 但是在使用公共资源时必须要小心,因为您的应用程序可能会开始表现得很奇怪。 为了避免这种情况,我建议你阅读我的另一篇博文 ,解释为什么会发生这种情况以及如何避免它。

如果您希望它也是线程安全的,您还可以锁定执行,然后在应用程序启动时标记模块。 这是最安全的方式。

 private static bool isStarted = false; private static object moduleStart = new Object(); ... if (!isStarted) { lock(moduleStart) { if (!isStarted) { // handle aplication start ... isStarted = true; } } } 

我创建了自己的库,可以挂钩现有的应用程序,比如Sharepoint 2010.我现在不想改变Sharepoint的Global.asax吗? 使用博客文章中解释的技术,我能够加入它。 容易。

我猜这正是你一直在寻找的。 通过在web.config添加模块来挂钩任意应用程序的启动事件。 这样做吧。 它会工作。

我同意达林的观点。

原因是需要加载应用程序才能加载模块,那么在应用程序准备开始加载模块本身之前,如何在模块中执行代码呢?

你想做什么? 可能值得评估您的解决方案的想法是什么:)

希望这可以帮助 :)

您无法附加到HttpModule中的Application_Start事件。 这是可用事件列表 。

事实上,在应用程序池回收之前,始终只有一个特定http模块的实例。 当然,每个Web应用程序的w3wp.exe工作者。

换句话说,使用init方法或构造函数来进行初始化,预加载数据等;)并且不要使用静态字段,除非您需要在请求开始触发模块订阅的事件时执行锁定,并且您需要更改模块控制的数据或包含作为属性。 无论如何,在应用程序启动时调用init方法。

如何知道带锁定代码的Init()是否是第一个被调用的模块? 当然可以先实例化其他模块吗? 这不是Global.asax的Application_Start事件的区别 – 它保证首先被设计调用吗?

我对这个post感兴趣,以及在修复旧ASP.NET站点中的错误时网站是如何启动的。

所以我整理了一个演示,看它是如何工作的。 似乎来自web.config的订单IS。

你可以在这里看到https://github.com/jradxl/MVC-Website-Without-Global.asax.cs它实现了Robert Koritnik解决方案 – 谢谢