【问题标题】:Asp.Net Core prevent console app shutdownAsp.Net Core 防止控制台应用程序关闭
【发布时间】:2018-09-12 16:19:55
【问题描述】:

我们有一个内置在 IIS 上的 asp.net core 2.0 网络应用程序。从这个应用程序中,我们正在调用一个控制台应用程序,该应用程序执行来自数据库的排队请求。

问题是应用程序被很少人使用,因此它和控制台进程执行很长时间的处理。但是当 Web 应用程序关闭时,此控制台应用程序会自动停止。从事件日志中,我们得到以下输出。 (来源:IIS AspNetCore 模块)

向进程“3548”发送关闭 HTTP 消息并接收到 http 状态 '202'。

我们尝试将 Web 应用的 StartMode 设置为始终在 IIS 应用程序池高级设置中运行。但是,当一段时间后没有人使用该应用程序时,它仍然会停止。

有什么办法吗?

【问题讨论】:

  • “从这个应用程序中,我们正在调用一个控制台应用程序,它执行来自数据库的排队请求”不是正确的方法。相反,始终运行控制台应用程序并让您的 Web 应用程序通过典型的进程间通信它交流。

标签: c# iis asp.net-core console-application


【解决方案1】:

您似乎错误地解决了问题。我不会从 Web 应用程序调用控制台应用程序。相反,理想情况下,您应该创建一个后端服务(例如:Windows Service with .NET Core),它会定期监控您的队列表并逐步对其进行处理。

这将使您的代码模块化(参考SOLID principles)。它还将缓解您在与 Web 应用程序相同的进程中运行控制台应用程序时遇到的问题。

【讨论】:

  • 我必须在从 Web UI 触发控制台应用程序(或服务)时立即启动它。此外,一旦它运行,队列中可能会有其他项目。所以定期检查是行不通的。也可能会出现数周内没有来自 UI 的请求的情况,因此始终不需要在后端运行控制台应用程序。
  • 一个没有工作的服务如果正确完成不应该占用任何重要资源
  • Sid - Mike 说的。另外,我不明白为什么定期检查在您提到的情况下不起作用。事实上恰恰相反,这正是此类服务的目的所在。当然,在构建此服务时,您需要适当考虑访问和处理 Queue table 的锁定/并发问题。
  • 在您最初的问题中,您提到您的这个控制台应用程序需要花费时间。在这种情况下,您可能会在处理过程中再次检查队列以包含任何新的记录并包含它们。或者,如果您在 Queue 中看到更新,您可以重新开始处理(取决于哪种方案对您来说更快)。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多