【问题标题】:Cannot keep alive Web Application on IIS after Recycling or Restarting回收或重新启动后无法在 IIS 上保持活动的 Web 应用程序
【发布时间】:2016-02-09 04:22:58
【问题描述】:

我有一个MVC 应用程序,它定期使用Quartz.NET 发送电子邮件。发布的应用虽然在IIS上可以正常运行,但是在回收应用池或者重启IIS上的应用后就不能正常运行了。在网上搜索,我发现有几篇帖子建议对配置文件或IIS 进行一些更改,但它们都不能正常工作。那么,有什么方法可以解决这个问题吗?我需要一个可以在应用程序端应用的解决方案(或者在 IIS 端,如果它很简单,只需进行配置更改等)。我认为这是在IIS 上保留应用程序时的常见问题,不是吗?
注意:我使用的是 Windows Server 2008 和 IIS 7.5。

【问题讨论】:

  • Web 应用程序发布在哪里? ISP 还是内部?几个月前,我answered 提出了关于应用程序池和quartz.net 的问题。
  • @LeftyX Mnay 感谢您的回复。实际上,您展示了可能性,之后强制应用程序在 IIS 服务器上始终处于活动状态是有意义的。我在 IIS 服务器上发布了应用程序,根据您的帖子,我认为使用 Windows 服务是我的最佳选择。那么,您能否澄清一下我应该进行哪些更改?我有一个 MVC5 Web 应用程序,但不知道如何每周触发应用程序或 Quartz 作业?我知道 Windows 调度程序设置,我只需要我应该在应用程序、石英和 Windows 端进行的其他设置。非常感谢。
  • 这对我来说似乎是一个配置问题。可能是重新启动 IIS 时应用程序没有完全杀死,或者启动配置不是 100% 正确。只是猜测。

标签: c# asp.net-mvc iis scheduled-tasks quartz.net


【解决方案1】:

你没有在你的问题中提到你的应用程序将在哪里运行,所以我猜它会在内部托管。

根据您的评论,我认为您在服务器上安装和运行 Windows 服务没有任何问题。

我的建议 - 以及我过去实施的一些建议 - 仅将 ASP.NET MVC 应用程序用作 UI,您可以在其中创建、删除或暂停您的作业/触发器,这些作业/触发器将持久保存在数据库中,因此,无论如何发生在您的应用程序中,您不会丢失您的工作/触发器,它们将在应用程序重新上线后立即执行。

数据库将与另一层共享,即 Windows 服务,它将负责运行您的计划作业。

第一步是设置和使用AdoJobStore 来存储 Quartz.Net 数据。正如您在帖子中看到的,您可以使用一些提供程序。

第二步是创建和配置您的 Windows 服务。我会使用TopShelf 来托管它。实现非常简单明了;此外,您还可以使用 here 提供的 Quartz.Net 集成。

如果您仔细阅读文档,您不会发现集成解决方案有任何问题。

Quartz.Net 取决于您必须在 app.config/web.config 中添加的一些配置。在这个answer 中有关于配置和AdoJobStore 的详细说明。

在实施此类解决方案时需要记住一些事项。
您的 Web 应用程序将在您的配置中将属性 threadPool 设置为 ZeroSizeThreadPool

<add key="quartz.threadPool.type" value="Quartz.Simpl.ZeroSizeThreadPool, Quartz" />

或在您的代码中:

properties["quartz.threadPool.type"] = "Quartz.Simpl.ZeroSizeThreadPool, Quartz";

它永远不会启动调度程序(您的 Windows 服务将使用它)。

【讨论】:

  • 非常感谢您的详细解释。我只是有时间继续,并想确定是否最好在同一解决方案中使用控制台应用程序和 MVC 应用程序,并从 Windows 计划任务中调用它。因为我尝试了很多东西,但没有一个有效,我真的不想应用不同的方法,除了当前的方法。对于 Quartz 或 Hangfire 使用控制台应用程序或保持应用程序(发布到 IIS)活动的任何想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2011-05-05
  • 2014-10-16
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多