asp.net - 带有控制台应用程序 vs. NET 调度工具的Windows 调度程序API使用 ASP.NET MVC在我的ASP.NET MVC中执行长时间运行的流程

  显示原文与译文双语对照的内容
115 1

我正在使用 ASP.NET mvc-5 web应用程序,部署在 Windows 2012 & iis-8.我的ASP.NET mvc有许多CRUD操作,它们在 ASP.NET mvc中作为动作方法实现。但我的ASP.NET web应用程序将执行计划长时间运行的网络扫描过程,网络扫描主要执行以下步骤:-

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

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

  • 我在 ASP.NET mvc中定义了一个模型方法来执行上述 4步。
  • 然后我安装hangfire工具,它将调用预定义调度程序上的扫描方法。
  • 我还在 ASP.NET mvc中创建了一个视图,允许用户设置hangfire计划设置( 这需要在hangfire主机服务器上执行IIS重置以获取新设置) 。

现在我对一个 150分钟的服务器运行了一个测试扫描,这些服务器花了大约 40分钟。i 注意到 if schedule schedule schedule ( 在IIS上没有活动的地方),hangfire将无法调用作业,一旦第一个请求被 missed,missed任务将运行。我通过定义每 15分钟调用IIS的Windows 任务来克服这个限制,以保持应用程序池的活动性。

我正在阅读的另一种方法是按照下面的步骤进行:-

  • 我可以以创建一个独立的控制台应用程序来完成扫描,而不是在 ASP.NET mvc内定义模型方法。
  • 然后在 ASP.NET mvc中创建视图,允许用户在 Windows 任务计划程序中创建和schdule任务。我可以通过与 Windows 任务调度器API集成来实现。
  • 这里 Windows 任务将调用控制台应用程序的位置。

现在我不确定哪种方法更好,为什么?现在一般来说,长期运行/后台作业不应该在iis下运行。但是同时定义这些长期运行的进程作为控制台应用程序并在 Windows 任务调度器中调用这些应用程序将在我的web应用程序中。将应用程序移动到另一个( 例如从测试到生活) 时,会增加额外的工作。除这里之外,我还阅读了 hangfire 。石英等工具,以允许在IIS内运行长期运行的任务并调度控制台应用程序。那么,任何人都可以对此进行建议?

时间:原作者:0个回答

53 3

我认为,如果可以以解决web应用程序端的调度问题,则无需创建调度器任务或者新的控制台应用程序。当你在web应用程序中使用调度任务时,你可能会遇到的问题通常是你可能看到的:调度程序在调试web应用程序期间工作起来像一个魅力,但在发布到 IIS 之后不能触发。这个问题通常与 IIS 相关,而不是调度器 Quartz.NETHangfire,等等,虽然有很多文章或者解决方案。除这里之外,大多数在web和机器配置上都需要大量的配置设置。

但是,这种调度问题还有一些解决方案,我相信为 6.0/7.5 for提供了一个for服务。只要将它安装到你发布应用程序的服务器上即可。然后,在应用程序池回收之后,iis/应用程序重新启动,等等 也将处于活动状态,并在 MVC 应用程序中使用,以发送通知邮件,而不存在任何问题。下面是我在 MVC 应用程序中使用的示例代码。有关更多信息,请访问 ASP.NET 中的计划任务,使用 Quartz.NetQuartz.Net CronTrigger 。


Global.asax:

protected void Application_Start()
{
 JobScheduler.Start();
}


EmailJob.cs:

using Quartz;
public class EmailJob : IJob
{
 public void Execute(IJobExecutionContext context)
 {
 SendEmail();
 }
}


JobScheduler.cs:

using Quartz;
using Quartz.Impl;
public class JobScheduler
{
 public static void Start()
 {
 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 scheduler.Start();
 IJobDetail job = JobBuilder.Create<EmailJob>().Build();
 ITrigger trigger = TriggerBuilder.Create()
. WithIdentity("trigger1","group1")
. StartNow()
. WithSchedule(CronScheduleBuilder
. WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday, 10, 00)
//.WithMisfireHandlingInstructionDoNothing()//Do not fire if the firing is missed
. WithMisfireHandlingInstructionFireAndProceed()//MISFIRE_INSTRUCTION_FIRE_NOW
. InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("GTB Standard Time"))//(GMT+02:00)
 )
. Build();
 scheduler.ScheduleJob(job, trigger);
 }
} 

希望这有帮助。

原作者:
71 5
  • 我还在 ASP.NET mvc中创建了一个视图,允许用户设置hangfire计划设置( 这需要在hangfire主机服务器上执行IIS重置以获取新设置) 。

要更新任务日程,请重新设置web服务器?操作不正常。你可能会跟踪计划的时间 should should时间检查当前时间是否在预定的时间范围内,并在执行时检查是否已经在预定时间范围内。

i 注意到 if schedule schedule schedule ( 在IIS上没有活动的地方),hangfire将无法调用作业,一旦第一个请求被 missed,missed任务将运行。我通过定义每 15分钟调用IIS的Windows 任务来克服这个限制,以保持应用程序池的活动性。

hangfire文档有一个关于运行延迟任务的页面提到你需要更改什么来适应这个需求。

使用 Windows"任务计划程序似乎不是一个好主意;它并不意味着执行即时任务。你可以能需要立即创建任务,你可以能需要定义另一个任务来清理几十个后台任务。

你也正确地说,使用 Windows"任务计划程序将使你的应用程序更难于移动。

原作者:
...