通常我会考虑编写一个 Windows 服务来管理不适合托管在 Web 应用程序中的任务。这些类型的任务通常是长时间运行的进程或计划任务。尽管这通常是这些类型任务的主要方法,但人们已经通过在 Global.asax 公开的 Application_Start 事件中启动多个线程来研究在 Web 应用程序中运行这些类型的后台进程的方法。这种方法的问题一直是,如果您的 IIS 工作进程死亡,那么您的后台线程也会被杀死(实际上您的“Windows 服务”会停止,直到收到下一个请求)。
ASP .NET 4.0 为这个问题提供了一个解决方案。您现在可以按照Scott Gu的这篇博文中的说明将 StartMode 设置为“AlwaysRunning”。在这篇文章的评论中,有人问了一个关于在 IIS 中托管 Windows 服务类型任务的可行性的问题,因为新功能确保工作进程始终运行。斯科特提到它肯定会支持这种情况。此外,最近推出的AppFabric意味着 Microsoft 自己正在提供简单的挂钩,用于在 Web 应用程序中托管和监视 WCF 和 WF 服务。
对于我们这些曾经编写 Windows 服务来支持我们的 Web 应用程序的人来说,这意味着什么?我们应该采用这种模式吗?有哪些陷阱?据我所知,在 Web 应用程序中托管“Windows 服务”进程有很多好处,最有用的是易于部署。此外,我们实际上可以开始为我们的服务开发简单的用户界面,这些界面提供有关运行时发生的事情的信息。
如果我不得不走这条路,我认为我不会在面向客户的 Web 应用程序中托管我的“Windows 服务”类型的功能。我可能会开发一个新的 Web 应用程序项目(就像我在 Windows 服务上下文中所做的那样),它将托管我长期运行/计划的任务流程。我想这有几个原因。
- 安全。显示有关正在运行的后台进程信息的 UI 可能有不同的安全模型。我不想把这个 UI 暴露给除了运维团队之外的任何人。此外,Web 应用程序可以作为具有提升的权限集的不同用户运行。
- 维护。如果能够在不影响用户使用前端网站的情况下将更改部署到托管后台进程的应用程序,那就太好了。
- 性能。将应用程序与处理用户请求的主站点分开意味着后台线程不会削弱 IIS 处理传入请求队列的能力。此外,如果需要,可以将处理后台任务的应用程序部署到单独的服务器上。
我真的很想听听您对这种方法的看法,以及我是否应该坚持使用 Windows 服务。我很想尝试这种新方法。