【发布时间】:2016-06-01 08:21:29
【问题描述】:
我正在开发一个 asp.net mvc-5 Web 应用程序,部署在 windows 2012 和 iis-8 下。我的 asp.net mvc 有许多 CRUD 操作,这些操作在我的 asp.net mvc 中作为操作方法实现。 但是我的 asp.net mvc web 应用程序会进行预定的长时间运行的网络扫描过程,网络扫描主要执行以下步骤:-
- 从我们的数据库中获取我们的服务器和虚拟机列表。
- 使用 Rest API 从第三方工具获取每个服务器和虚拟机的扫描用户名和密码。
- 调用一些 powershell 脚本来检索服务器和虚拟机信息,例如网络信息、内存、名称等。
- 使用 Rest API 使用扫描信息更新我们的 ERP 系统。
现在我使用以下方法做了一个试点项目:-
- 我在我的 asp.net mvc 中定义了一个 Model 方法来执行上述 4 个步骤。
- 然后我安装 hangfire 工具,它将调用预定义调度程序上的扫描方法。
- 我还在我的 asp.net mvc 中创建了一个视图,它允许用户设置 hangfire 计划设置(这需要在主机服务器上执行 IIS 重置,以便 hangfire 获取新设置)。
现在我对大约 40 分钟完成的大约 150 台服务器进行了测试扫描,并且运行良好。我唯一注意到的是,如果我将计划设置为在非工作时间运行(在 IIS 上没有进行任何活动),那么 hangfire 将无法调用该作业,并且一旦发出第一个请求,错过的作业将跑步。我通过定义一个每 15 分钟调用一次 IIS 的 Windows 任务来克服这个限制,以保持应用程序池处于活动状态,并且它运行良好...
现在我正在阅读的另一种方法是执行上述操作如下:-
- 我可以创建一个单独的控制台应用程序来执行扫描,而不是在 asp.net mvc 中定义 Model 方法来执行扫描。
- 然后在我的 asp.net mvc 中创建一个视图,允许用户在 Windows 任务调度程序中创建和调度任务。我可以通过与 Windows 任务调度程序 API 集成来做到这一点。
- 此 Windows 任务将在何处调用控制台应用程序。
现在我不确定哪种方法更好,为什么?现在一般来说,长时间运行/后台作业不应该在 iis 下运行。但同时将这些长时间运行的进程定义为控制台应用程序并在 Windows 任务调度程序中调用这些应用程序将在我的 Web 应用程序上创建额外的依赖项。并且在将应用程序从移动服务器移动到另一个服务器时会增加额外的工作量(例如从测试到实时).. 除此之外,我还了解到hangfire、quartz 等工具旨在允许在 IIS 中运行长时间运行的任务,并且它们消除了创建控制台应用程序和使用任务调度程序调度这些控制台应用程序的需要。 那么有人可以就此提出建议吗?
【问题讨论】:
-
那么如何创建将在您的服务器上运行并通过 WCF 与您的 MVC 应用程序通信的 Windows 本地服务,并在此服务中使用quartz.NET 来安排作业?
-
@Marcin 现在quartz.net 将在iis 下运行,所以我将面临同样的问题,如果我在非工作时间安排长时间运行的进程,那么应用程序池将不会正在运行,所以后台作业不会触发...
-
看我的回答; Hangfire 建议保持应用程序池始终运行并禁用空闲超时。
-
@john G 为什么quartz.net 会在iis 下运行?您可以创建自己的本地服务,该服务将出现在此处的列表中:
%windir%\system32\services.msc,然后您可以从那里运行您的 quartz.net 作业。我正在将此解决方案用于 HID 卡号码同步,并且效果很好。此本地服务通过 WCF 公开一些方法。长话短说:本地服务直接在物理服务器上工作,并与我在 IIS 上运行的 MVC 应用程序进行通信 -
“长时间运行/后台作业不应在 iis 下运行” 正确。 正确的架构是让控制台应用程序扫描您的系统并将您的节点列表写入一个平面文件或数据库,供您的网络应用读取
标签: asp.net asp.net-mvc iis asp.net-mvc-5 console-application