我们在Asp.Net网络应用程序中实施了一个“后台服务”,它以随机的间隔从MSMQ接收消息,而不需要HTTP请求来启动应用程序。我们使用serviceAutoStartProvider自动启动此网络应用。
当IIS最初启动,服务器重新启动等等时,Everyhing正常工作,我们收到消息就好了。 BUT 如果我们只是在IIS中停止该站点(不接触应用程序或应用程序池),则应用程序将停止接收MSMQ消息。当我们再次启动网站时,不会再次调用serviceAutoStartProvider,因此我们的应用程序不会再次开始收听MSMQ消息!
如果我们在IIS站点停止并再次启动后对Web应用程序发出HTTP请求,它将再次开始侦听MSMQ消息。
即使IIS站点停止,我们的“后台服务”Web应用程序是否应该继续收听MSMQ消息?它不会得到任何请求,但我认为它应该继续运行。
当IIS站点停止时,Asp.Net应用程序/应用程序池中究竟发生了什么?我们可以联系到任何事件?应用程序池声称在IIS管理器中“已启动”,但代码未在其中运行。
为什么在重新启动网站时我们的serviceAutoStartProvider不会被调用?我相信这是“按设计”,因为应用程序并没有真正停止。但是,应用程序也没有运行,必须被实际的HTTP请求唤醒。
答案 0 :(得分:2)
当IIS Web App关闭时(例如,由于没有新的HTTP(S)请求超时时间),.NET应用程序域(在应用程序池工作进程内)完全关闭和卸载。这包括所有后台线程,包括.NET线程池使用的线程。
Web App可以配置更长(或没有)超时,然后后台工作线程可以继续处理工作。
但更好的办法是在完全独立管理的专业服务流程中运营这些员工。
或者,更好的是,使用带有WCF的IIS应用程序托管来创建MSMQ侦听器。我理解,在这种情况下,如果在关闭后收到新消息,Windows进程激活服务与IIS的集成将重新启动Web应用程序。
答案 1 :(得分:0)
我会在Windows服务中托管MSMQ监听器。为什么要将它连接到IIS?
<强>更新强>
实际上我的意思是为什么将MSMQ和ASP NET结合在同一个应用程序池中?
答案 2 :(得分:0)
您现在可以使用IIS8(和IIS7.5)的“应用程序初始化”功能,可以在以下位置找到更多信息,包括版本可用性和使用文档:
http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization
这取代了不再受支持的“应用程序预热模块”,并为我们提供了对“始终运行”场景中组件/服务初始化的适当控制。