【问题标题】:How to host Windows Service (like) in IIS如何在 IIS 中托管 Windows 服务(类似)
【发布时间】:2013-05-08 23:30:00
【问题描述】:

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

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

【问题讨论】:

    标签: c# wcf iis


    【解决方案1】:

    简而言之,你不能。

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

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

    您可以通过这种方式获得部分解决方案:

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

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

    【讨论】:

      【解决方案2】:

      简而言之,你不能。

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

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

      有关您需要实现的类的详细信息,以便在有工作要做时调用

      这个关于 SO 的答案也可能有帮助 Understanding heartbeat in ASP.NET health monitoring

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

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

      【讨论】:

      • 谢谢!我去看看... ...稍后再回来!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多