我正在实现一个简单的HttpModule,想要在Web应用程序启动时运行一些代码。但我惊讶地发现,我通常从Global.asax使用的Application_Start事件在HttpModule中不可用。这是正确的吗,还是我漏掉了什么?
如何从HttpModule钩入Application_Start事件?
更新:
我已经通过使用Init事件找到了一个简单的解决方案,但它仍然让我感到有点奇怪。
我正在实现一个简单的HttpModule,想要在Web应用程序启动时运行一些代码。但我惊讶地发现,我通常从Global.asax使用的Application_Start事件在HttpModule中不可用。这是正确的吗,还是我漏掉了什么?
如何从HttpModule钩入Application_Start事件?
更新:
我已经通过使用Init事件找到了一个简单的解决方案,但它仍然让我感到有点奇怪。
HttpModule
来处理应用程序启动事件与其他人只写/相信他们读到的不同,我已经做了自己的部分,并发现可以使用HTTP模块来处理应用程序启动。这实际上是一种有点 hack 的方法,但可靠地工作。这绝对不是一个应该避免的东西,因为我在微软模块中也看到过(即 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 事件。这里是可用事件列表。
我同意Darin的观点。
原因是应用程序需要被加载才能加载模块,那么在应用程序准备开始加载模块之前如何执行模块内的代码呢?
你想做什么? 也许值得评估一下你的解决方案的想法 :)
希望这可以帮到你 :)