Windows调度程序API与控制台应用程序Vs .net调度程序工具与asp.net mvc在我的asp.net MVC中执行长时间运行的进程

joh*_* Gu 8 asp.net iis asp.net-mvc console-application asp.net-mvc-5

我正在开发一个在Windows 2012和iis-8下部署的asp.net mvc-5 Web应用程序.我的asp.net mvc有很多CRUD操作,它们在我的asp.net mvc中作为动作方法实现.但我的asp.net mvc web应用程序将进行预定的长时间运行的网络扫描过程,网络扫描主要做以下步骤: -

  1. 从我们的数据库中获取我们的服务器和虚拟机列表.
  2. 使用Rest API从第三方工具获取每个服务器和vm的扫描用户名和密码.
  3. 调用一些powershell脚本来检索服务器和vms信息,例如网络信息,内存,名称等.
  4. 使用Rest API使用扫描信息更新我们的ERP系统.

现在我使用以下方法做了一个试点项目: -

  • 我在asp.net mvc中定义了一个Model方法来完成上述4个步骤.
  • 然后我安装hangfire工具,它将在预定义的调度程序上调用scan方法.
  • 我还在我的asp.net mvc中创建了一个View,它允许用户设置hangfire计划设置(这需要在主机服务器上进行IIS重置以获取新的设置).

现在我对150个服务器进行了测试扫描,大约需要40分钟才能完成,并且运行良好.我唯一注意到的是,如果我将计划设置为在非工作时间运行(在IIS上没有活动),那么hangfire将无法调用该作业,并且在第一次请求完成后,错过的作业将跑.我通过定义一个每15分钟调用一次IIS的Windows任务来克服这个限制,以保持应用程序池的正常运行,并且运行良好...

现在我正在阅读的另一种方法就是按照以下方式进行:

  1. 我可以创建一个单独的控制台应用程序来进行扫描,而不是在asp.net mvc中定义模型方法来进行扫描.
  2. 然后在我的asp.net mvc中创建一个视图,允许用户在windows任务调度程序中创建和调度任务.我可以通过集成Windows任务调度程序API来实现.
  3. 此Windows任务将调用控制台应用程序.

现在我不确定哪种方法更好,为什么?现在一般来说,长时间运行/后台作业不应该在iis下运行..但同时将这些长时间运行的进程定义为控制台应用程序并在Windows任务调度程序中调用这些应用程序将在我的Web应用程序上创建额外的依赖项.将应用程序从移动服务器移动到另一个服务器时(例如从测试到实时)将增加额外的工作量.除此之外,我还读到了诸如hangfire,quartz等工具的设计,允许在IIS中运行长时间运行的任务并消除它们需要使用任务调度程序创建控制台应用程序和调度这些控制台应用程序..所以有人可以就此提出建议吗?

Eri*_*erk 0

  • 另外,我在 asp.net mvc 中创建了一个视图,允许用户设置hangfire 计划设置(这需要在主机服务器上执行 IIS 重置,以便hangfire 才能获取新设置)。

您要重置网络服务器以更新任务计划吗?这听起来不太健康。您可能要做的就是跟踪计划时间应该是什么,并在执行时检查当前时间是否在计划时间的特定范围内(或已经执行),否则中止作业。

我唯一注意到的是,如果我将计划设置为在非工作时间运行(IIS 上没有进行任何活动),则hangfire 将无法调用该作业,并且一旦发出第一个请求,错过的作业将跑步。我通过定义一个 Windows 任务来克服这个限制,该任务每 15 分钟调用一次 IIS,以保持应用程序池处于活动状态,而且效果很好......

Hangfire 的文档有一个关于运行延迟任务的页面,其中提到了您需要更改哪些内容来适应这种情况。

使用 Windows 的任务计划程序似乎不是一个好主意;它不适用于执行临时的、短期的任务。您可能需要提升才能创建任务,并且可能需要定义另一个计划任务来清理执行几十个后台作业后可能存在的堆积如山的任务。

您也正确地认为,使用 Windows 的任务计划程序会使移动应用程序变得更加困难。