如何在第一个请求之前导致HttpModule被调用?

问题描述:

我有几个应用程序正在部署到.NET/IIS环境。对于这些应用程序,我已在web.config的system.web/httpModules部分中注册了IHttpModule的实现。在我的IHttpModule实现中,我有一个Init()方法,它启动一些守护进程线程并记录应用程序已启动。如何在第一个请求之前导致HttpModule被调用?

我的问题是Init()不会被调用,直到第一个HTTP请求进来。是否有办法强制系统继续并立即执行我的模块,而不是等待第一个HTTP请求?

+0

您应该考虑澄清问题的标题 – STW 2010-07-28 17:06:22

+0

您是否有更好的标题建议?我对.NET世界很陌生,所以我不知道什么标题对.NET专家更有意义。 – 2010-07-28 21:22:25

+0

我认为我的根本脱节是具有J2EE经验我习惯于实现ServletContextListener并在应用程序容器重新启动或应用程序部署时随时调用contextInitialized()方法。这可能会在HTTP请求进入之前发生,因此我可以使用它来设置服务并进行初始化。我在.NET世界中寻找类似的“应用程序生命周期”事件。 – 2010-07-28 23:58:47

你应该在Application_Start方法的代码移到Global.asax file

protected void Application_Start(object sender, EventArgs e) 
{ 
    //your initialization code 
} 

更新:
正如在评论中指出,这不是解决问题的Application_Start的解决方案也被称为在第一请求。

因此,似乎唯一的解决方案是在IIS重新启动后立即找到调用网页的方法。

这里有一些建议从another website

一个棘手的解决这个问题 可以增加你的网站搜索引擎 。搜索引擎频繁地抓取页面 。所以,他们会打你的网站的页面 导致 Application_Start,因此服务 将启动并运行。

另一个想法是将您的 网站注册到一些流量或 可用性监控服务。 有很多网络服务,其中 密切关注您的网站,并检查 是否存活以及 的表现是否令人满意。所有这些 服务打你的网站页面和 然后收集统计数据。所以,通过 注册这样的服务,你可以 保证你的web应用程序是 一直活着。

我会去与监控服务解决方案,服务等(我没有尝试他们):
http://www.montastic.com/
http://www.siteuptime.com/

+0

这将如何不同?根据您链接的Wikipedia页面,“在运行时,在第一个请求到达时,Global.asax将被解析并编译为动态生成的.NET Framework类。”这与我在Global.asax中看到的行为一致。 – 2010-07-28 20:21:42

+0

你是对的。我确信当IIS启动应用程序时它会被解雇。 我更新了我的答案,添加了另一个解决方案(尽管它比解决方案更适用于解决方法) – 2010-07-29 09:47:57

如果你在IIS7您可以使用IIS应用程序预热模块以确保您的应用程序始终处于运行状态:http://learn.iis.net/page.aspx/688/using-the-iis-application-warm-up-module/

还检查应用程序池设置,以便在没有任何活动时不会关闭并重新启动。

否则,我建议你创建一个NT服务,并把守护线程放在那里。

+0

我应该提到这是IIS6。 – 2010-07-28 17:16:01

+0

即使我可以将守护程序线程移动到另一个进程中,我仍然希望应用程序立即通过所有启动过程,而不是等待第一个HTTP请求。 – 2010-07-28 17:16:52

+0

您可以将初始请求作为部署过程的最后一步,并将应用程序池设置为不回收。 – 2010-07-28 17:22:09