【问题标题】:Can we run part of an ASP.NET Core MVC web application as console application which is scheduled using Windows Task scheduler我们能否将 ASP.NET Core MVC Web 应用程序的一部分作为控制台应用程序运行,该应用程序使用 Windows 任务调度程序进行调度
【发布时间】:2021-10-08 18:32:44
【问题描述】:

我正在开发一个包含两个主要部分的新项目:-

  1. 从 SharePoint Online 读取文件并将其发送到外部 API 的预定服务。

  2. 外部 API 将使用人工智能模型处理接收到的文档 >> 从文档中提取数据 >> 然后将提取的数据推送回我们的系统 >> 我们的系统将使用提取的数据更新 SharePoint。

所以目前我正在定义我将要使用的架构和技术,我在此阶段定义以下内容:-

  1. 对于第一点,我将构建一个 .net 核心控制台应用程序 >> 将其托管在 windows 服务器中 >> 使用 windows 任务调度程序对其进行调度。此服务将使用 SharePoint API 从 SharePoint 读取文件 >> 将它们发送到外部 API。

  2. 但我不确定第 2 点?我将如何从系统内部的外部 API 接收推送的数据?我可以在控制台应用程序中定义 API 端点吗?或者为此我需要构建类似 ASP.NET Core MVC 托管在 IIS 中的东西,它暴露了一些 API 端点来获取推送的数据?请记住,外部 API 和我们的系统将安装在同一个 Windows 服务器中。或者我可以构建一个 ASP.NET Core MVC Web 应用程序,它将控制器类公开为 API 端点 + 使用其控制台应用程序 program.cs 使用 Windows 任务调度程序进行调度?

谢谢

【问题讨论】:

  • 除了HTTP之外,还有很多方法可以实现进程间通信。有消息队列、数据库、许多特定于操作系统的方法。
  • @mason 你能就此提供更多建议吗?
  • @mason 在我的情况下,我将使用WebClient() 进行调用,但我担心的是我如何才能拥有一个公开 API 的应用程序 + 有计划的工作?例如,我应该创建 2 个单独的应用程序吗?一个创建为 .net core 控制台应用程序,另一个创建为 asp.net core mvc ?或者我们可以使用控制台应用程序或 asp.net 核心 Web 应用程序在一个应用程序中实现这一点。你明白我的意思吗?谢谢
  • 您可以随心所欲地构建您的应用程序。尝试一些东西。如果它不起作用,请提供minimal reproducible example 并解释您的方法有什么问题。 Stack Overflow 在这里回答特定的编程问题和答案,而不是构建您的应用程序。
  • 基于@mason 的评论,我肯定会为这个用例使用后端处理器。我是 Rebus 的忠实粉丝,我在下一个链接中的博客文章展示了如何在 Rebus 中构建一个长期运行的工作流。工作流由 API 调用启动,这听起来与您的场景相关:seankearon.me/posts/2020/12/rebus-sagas-csharp

标签: asp.net asp.net-core iis asp.net-core-mvc class-library


【解决方案1】:

外部 API 处理完数据后,当它返回数据到你的系统时,应该有一个端点供外部 API 调用和发送数据。因此,您可以创建一个 Asp.net 核心 MVC 应用程序并公开相关的端点方法。

对于控制台应用程序,它用于创建计划服务,对吗?如果是这种情况,您可以create background tasks with hosted services,并将其添加到您的 MVC 应用程序中,则无需创建控制台应用程序。

你也可以参考这个帖子:How can I execute a method every year using BackgroundService in ASP.NET core Application?

编辑

Asp.net 核心应用程序可以作为 Windows 服务托管在 Windows 上,您可以创建 API 应用程序并将其作为 Windows 服务托管以接收来自外部 API 的数据,请参阅 Host ASP.NET Core in a Windows Service

此外,您还可以使用 Google 或 Bing 搜索“在 .NET Core 3.1 中使用 API 门创建 Worker 服务”,有多个教程或示例可以使用 API 创建 Worker 服务。

【讨论】:

  • 我们是否应该在 IIS Web 应用程序中运行长时间运行的进程和后台进程总是存在争议,因为 IIS Web 应用程序不是为运行长时间运行的进程或后台进程而设计的。我是否正确?不确定 .net 核心的具体功能是什么,但我说的是 .net 和 asp.net 应用程序。我说的对吗?
  • 您能否就我的上述评论提供更多建议?谢谢
  • 对于托管服务,它们是您在主机/应用程序/微服务中托管的服务/逻辑。请注意,在这种情况下,托管服务仅表示具有后台任务逻辑的类。 Asp.net 核心应用程序可以作为 Windows 服务托管在 Windows 上,您可以将 API 应用程序作为 Windows 服务托管以接收来自外部 API 的数据,请参阅Host ASP.NET Core in a Windows Servicethis link
【解决方案2】:

我对此的想法,已经构建了类似的解决方案:

  1. 调度器感觉很好,除非你想集群它,在这种情况下,你可以使用Quartz.Net之类的组件来确保每个作业一次只在一个服务器上运行。

  2. 这取决于外部 API 如何返回结果。最常见的选择是让您提供 Internet API 端点,并让外部 API 充当其客户端。您不会使用 MVC 应用程序,因为您没有为外部 API 提供 Web UI - 这里是 example .Net Core API

您需要确保 API 端点是安全的,如上例所示。最简单的选项可能是 API 密钥,但同样取决于外部 API、返回结果的选项以及可能的开发人员。

连接、托管和数据

这感觉像是一个关键的考虑因素。您可以在 IIS 或任何其他进程类型(例如 Windows 服务或控制台应用程序)中托管 HTTPS 端点。但是您需要将该进程公开到 Internet 以便外部 API 可以正确调用它?

您是否可以使用 Azure 等云提供商来降低其中一些成本,这是值得一看的:

这当然取决于数据本身的托管位置以及您是否可以移动部分或全部数据。这是我首先要关注的设计领域。

无论您选择哪个选项,您都可能需要启用与主系统的入站连接。

【讨论】:

    【解决方案3】:

    您可以通过多种方式发布,使用控制台应用程序并让 Windows 任务调度程序处理调用有点简单,但他们说简单就是王道,据称 :) 我会基于 .net 后台工作人员服务就像线程中建议的那样,或者如果有 Azure 函数。

    所以“我可以发布/接收推送的数据吗”,是的,您当然可以,根据您的经验,您可能希望支持 WCF、SOAP、REST 等一些接收/客户端选项,您可以找到虚拟铲载在网络上做的例子,取决于你的商业伙伴知道什么,如果你可以选择,选择 REST。但这真的不重要,这会给业务伙伴带来更多的微笑,您可以让他们访问一个简单的 FTP 服务并将文件作为批处理的东西进行处理,或者在他们上传时使用 FileSystemWatcher 来触发。

    那么对方是如何推送数据的呢?好吧,这取决于他们支持什么,您确定他们没有您可以查询的端点吗?取决于谁拥有主动权,而且大多数情况下,我们会构建系统,让某人做某事,而我们除了他们对我们的 API 提出的要求外,什么都不做。

    所以我们最终你将不得不超越构建你计划的东西,阅读并复制这个然后修改一个 POST 地址以接受他们关闭的有效负载,如果他们可以播放 HTTP REST:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2018-11-21
      • 1970-01-01
      • 2016-06-30
      相关资源
      最近更新 更多