3

如何在 IIS 中托管 Windows 服务并保持该服务像在 Windows 上运行一样运行?我可以使用 WCF 服务中的某些功能吗?

我无法访问 Windows 本身,只能访问 IIS。在该服务中,我将创建一个线程,该线程将在预定时间处理一些数据。

4

2 回答 2

5

简而言之,你不能。

更详细的答案是有2个问题:

  1. IIS 工作进程仅在 HTTP 请求进入时启动。这意味着您无法使用系统启动服务。
  2. IIS 工作进程在几个条件下被回收(即重新启动)。例如,如果长时间没有 HTTP 请求进来,则重新启动一个工作进程。这意味着您无法控制服务何时关闭,除非您有权访问应用程序池回收配置。请记住,回收逻辑仅确保所有挂起的 HTTP 请求都完成,但不会等待所有后台线程完成。

您可以通过这种方式提供部分解决方案:

  1. 创建一个 WCF 服务方法,检查您的长时间运行的线程是否处于活动状态,如果没有,则启动它。
  2. 创建一个非常简单的Windows 服务,它会定期(每 5 秒一次)调用该方法。将服务部署在某个地方,例如在您自己的机器上。

剩下的唯一问题是:您真的需要避免使用 Windows 服务吗?你能找到一个地方来主持这项服务吗?当 Windows 服务是最好的甚至是唯一的方法时,有一些用例。

于 2013-05-08T15:30:00.603 回答
1

你不能,简而言之。

但是,您可以使用运行状况监控 API,特别是心跳功能。看:

http://msdn.microsoft.com/en-us/library/system.web.management.webheartbeatevent.aspx

有关课程的详细信息,您需要在有工作要做时调用

这个关于 SO 的答案也可能有助于 理解 ASP.NET 健康监控中的心跳

一旦你实现了一个 webheartbeatevent 派生类,你就可以检查你的数据库或者你想要检查的是否有工作要做。

恕我直言,更好的解决方案是完全废弃服务并将系统重新设计为 100% 基于 Web,因为服务成为部署和维护的噩梦。正如我假设你现在正在发现......

于 2013-05-08T15:19:58.223 回答