【问题标题】:Calling an asp.net mvc controller’s action method using windows task scheduler or another schdule tools使用 windows 任务调度程序或其他调度程序工具调用 asp.net mvc 控制器操作方法
【发布时间】:2016-03-24 06:46:23
【问题描述】:

我计划创建一个 asp.net mvc web 应用程序,它将执行单个同步作业,以实现此目的:-

  1. 我们有一个第 3 方 ERP 系统,它会及时生成一个 .csv 文件,每小时会生成一个 .csv 文件。 .csv 文件包含有关我们公司资产的信息,例如类型、价格、名称、位置等……

  2. 现在我将开发一个 asp.net mvc Web 应用程序,它将读取 .csv 数据并使用此数据更新数据库。

所以我打算做以下事情:-

  1. 我将创建一个包含数据的新数据库。

  2. 我将创建一个新的 asp.net mvc-5 Web 应用程序,它有一个 SYNC 操作方法,它将读取 .csv 数据,并更新数据库。

现在我面临的问题是我需要每小时或按特定时间表运行同步作业。现在根据我以前的经验,我可以列出这两种及时调用动作方法的方法:-

  1. 在 asp.net mvc 的 global.asax 中,我可以创建一个每小时运行的计划。

  2. 我可以使用 Hangfire 等第三方工具来安排任务。

现在使用这些方法中的任何一种都会导致这种限制:-

  1. global.asax 或第三方工具如 Hangfire 将在应用程序池下运行,如果没有对应用程序执行任何操作,则调度将永远不会运行,因为应用程序池将不会处于活动状态。但在我之前的应用程序中,这并不是一个真正的问题,因为系统在计划作业旁边包含许多视图,因此系统在工作时间内几乎 100% 保持活跃。

但在我当前的项目中,用户不会访问 Web 应用程序,因为它只会执行一次同步工作,并且没有任何其他功能可供最终用户使用。所以在这种情况下,同步作业将永远不会运行,因为应用程序池不会处于活动状态。 如果这些方法听起来对解决我的问题有效,任何人都可以提出建议:-

  1. 创建一个将每小时调用操作方法 URL 的 Windows 计划任务:-

schtasks /create /tn "我的计划任务" /tr "powershell -ExecutionPolicy 不受限制 -Command \"(New-Object Net.WebClient).DownloadString(\\http://url .to.be.executed/cron.php\\")\" /sc DAILY /st 07:00:00 /ru System

  1. 在 global.asax 中创建 2 个计划任务。一个调度任务将每 5 分钟调用一次应用程序 url 以保持应用程序池处于活动状态,另一个调度任务每小时调用一次同步操作方法。在这种情况下,应用程序将每 5 分钟调用一次自身,这将强制应用程序池处于活动状态,并且即使没有用户访问系统,同步作业也会每小时运行一次……

请问有人可以就这方面提出建议吗?

谢谢

【问题讨论】:

  • 您在寻求什么样的建议?你需要清楚。对了,你可以配置Hangfireto always run
  • @mason 但是我可以添加一个 Windows 计划任务,例如每 10 分钟调用一次应用程序,并按原样使用 hangfire,而无需将其配置为始终运行?
  • 当然,我想你已经知道了。
  • 应用程序池如果没有收到请求就会关闭。如果你有东西向它发出请求,那么它不会因为空闲而关闭。不,Hangfire 不能强迫它保持打开状态。在某些时候,如果应用程序池出现故障,那么它杀死你的工作。这就是为什么 Hangfire 文档鼓励您在 re-entrant 工作。
  • 当然,您可以手动将其删除。或者一个与 HTTP 请求/响应无关的线程可能有一个未处理的异常,导致一切停止。但这没关系。如果我是你,我会停止问无休止的问题,而是实施我正在谈论的内容并了解它是如何工作的。 测试自己。

标签: asp.net iis asp.net-mvc-5 scheduled-tasks application-pool


【解决方案1】:

MVC 是关于用户交互的,许多用户在那时与同一个应用程序交互。如果您只需要按计划运行一项任务,那么您甚至不需要 UI,并且不存在需要同时处理多个远程请求或满足 Web 应用程序的问题。您实际上可以只创建一个控制台应用程序并使用 Windows 任务计划程序。 MVC 完全是矫枉过正,不仅如此,不适合目的。

【讨论】:

  • 如果我永远不会向应用程序添加更多功能,那么你是对的。但在我们的例子中,我希望在 asp.net mvc Web 应用程序中使用它,因为我们可能会在同步之外添加额外的功能作业,那么使用 Windows 任务计划程序调用操作方法是一种遵循的方法吗?
  • 使用某些工具是错误的,因为您将来可能使用功能。如果您以后需要添加 web 类型的东西,您可以创建一个 MVC 项目 then 并将此功能迁移到该项目。但是,有一种说法是,此功能完全不适合 Web 项目。将 MVC 用于 Web 内容并将其用作控制台应用程序。没有什么说你必须拥有一件事。如果有交叉,这两个东西可以通过类库共享代码。
  • 所以你的意思是最好编写一个控制台应用程序并从 Windows 调度程序调用这个控制台应用程序?你是这个意思吗 ?第二个问题,现在我以前从未编写过控制台应用程序,所以不确定它会部署在哪里?或者它将作为 .exe 文件运行?
  • 是的,对于这个特定的任务,控制台应用程序最适合。控制台应用程序非常简单,特别是如果它们是自给自足的并且不需要用户输入(这意味着您不必担心处理控制台标志等)。您甚至不需要发布它们。只需使用 Release 配置构建,然后从 bin 目录中获取文件。您将获得一个包含 exe 和任何支持 DLL 的文件夹。只需将其部署在您喜欢的任何地方并创建一个任务来运行它。
  • ok thnaks。在我的情况下,我可能还需要用户手动运行同步作业。假设用户想要同步结果,并且他不想等待时间表,所以我将在网页内添加一个同步按钮..所以在这种情况下,我需要启用网络同步,这是正确的吗?如果我需要将同步作为我的 mvc 中的操作方法或作为控制台应用程序,我有点困惑。因为我需要它手动运行和/或根据计划运行。第二点我发现了许多工具,例如 Hangfire,它们旨在在应用程序池下运行后台任务,所以我应该什么时候使用这些工具?
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2012-04-21
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多