【问题标题】:Asp.net "background service" listening to MSMQ not working after IIS site is stopped/startedIIS 站点停止/启动后,Asp.net“后台服务”侦听 MSMQ 不起作用
【发布时间】:2012-02-07 17:19:27
【问题描述】:

我们在我们的 Asp.Net Web 应用程序中实现了一个“后台服务”,它以随机的时间间隔从 MSMQ 接收消息,而不需要 HTTP 请求来启动应用程序。我们使用serviceAutoStartProvider 自动启动这个网络应用程序。

当 IIS 最初启动时一切正常,服务器重新启动等等,我们收到消息就好了。 但是如果我们只是在 IIS 中停止站点(不涉及应用程序或应用程序池),应用程序将停止接收 MSMQ 消息。而当我们再次启动网站时,serviceAutoStartProvider 并没有被再次调用,所以我们的应用也不会再次开始监听 MSMQ 消息!

如果我们在 IIS 站点停止并重新启动后向 Web 应用程序发出 HTTP 请求,它会再次开始侦听 MSMQ 消息。

  1. 即使 IIS 站点停止,我们的“后台服务”Web 应用程序是否应该继续侦听 MSMQ 消息?它不会收到任何请求,但我认为它应该继续运行。

  2. 当 IIS 站点停止时,Asp.Net 应用程序/应用程序池中究竟发生了什么?我们可以连接到任何触发的事件吗?应用程序池声称已在 IIS 管理器中“启动”,但代码并未在其中运行。

  3. 为什么站点重新启动时我们的 serviceAutoStartProvider 没有被调用?我相信这是“设计使然”,因为应用程序并没有真正停止。但应用程序也没有运行,必须由实际的 HTTP 请求唤醒。

【问题讨论】:

标签: asp.net iis-7 iis-7.5 msmq


【解决方案1】:

您现在可以使用 IIS8(和 IIS7.5)的“应用程序初始化”功能,包括版本可用性和使用文档在内的更多信息可以在以下位置找到:

http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization

这取代了不再受支持的“应用程序预热模块”,并为我们提供了在“始终运行”场景中对组件/服务初始化的适当控制。

【讨论】:

    【解决方案2】:

    我会在 Windows 服务中托管 MSMQ 侦听器。为什么要将它与 IIS 耦合?

    更新

    其实我的意思是为什么要将 MSMQ 和 ASPNET 耦合在同一个应用程序池中?

    【讨论】:

    • 我们希望它在 IIS 中运行,因为它易于部署。我们有一个很好的设置,可以使用 Web Deploy 和 Web Farm Framework 将 Web 应用程序部署到我们相当复杂的环境中。
    • 老实说,部署的简易性并不会影响我在这里的考虑。我看到了一个创建不必要依赖的明显案例。
    • 依赖 IIS 来托管“服务”?我同意,在某种程度上。但是我们在 Windows 上缺少一个像样且便宜的应用服务器。微软唯一的东西是带有 AppFabric Hosting 的 IIS,还不是很令人印象深刻。对于 3 种不同的环境(配置),您如何建议在 10 多台机器上部署、托管和监控 X 个 MSMQ 侦听器实例?
    • 好吧,对不起,我并不是说 IIS 和服务之间的依赖关系。我对此没有很好的答案。但是为什么将两者都托管在同一个应用程序池中呢?这引入了您正在经历的服务生命周期耦合效应。
    • x 年后@hugh 如果部署 Windows 服务不是一个巨大的痛苦,还需要开发人员在每次修复错误时都依赖他们的网络团队,我本可以支持你的观点看法。 +1 发帖人对此答案的第一条评论。
    【解决方案3】:

    当 IIS Web 应用程序关闭时(例如,由于超时时间内没有新的 HTTP(S) 请求),.NET 应用程序域(在应用程序池工作进程内)完全关闭并卸载。这包括所有后台线程,包括 .NET 线程池使用的那些。

    Web 应用可以配置更长(或没有)超时,然后后台工作线程可以继续处理工作。

    但更好的做法是在完全独立管理的专业服务流程中运行此类工作人员。

    或者,更好的是,使用带有 WCF 的 IIS 应用程序托管来创建 MSMQ 侦听器。我理解在这种情况下,如果新消息在关闭后到达,Windows Process Activation Services 与 IIS 的集成将重新启动 Web 应用程序。

    【讨论】:

    • 啊,但这里的重点是它看起来不像 IIS Web App 实际上已关闭。只有 IIS 中的站点被停止。我收集这主要是因为我再次启动站点时 not 调用了 serviceAutoStartProvider。是的,我也开始认为,使用 AppFabric 在 IIS 7.5 中托管 MSMQ 侦听器的 WCF 服务是让 IIS 可靠工作的唯一方法。
    • 我会接受这个作为答案,因为这是我们最终要做的。 :-) (最后一部分:“使用带有 WCF 的 IIS 应用程序托管来创建 MSMQ 侦听器。我理解在这种情况下,如果新消息在关闭后到达,Windows Process Activation Services 与 IIS 的集成将重新启动 Web 应用程序.")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多