用于运行调度程序长时间运行任务的 Web Api 或 WCF

Posted

技术标签:

【中文标题】用于运行调度程序长时间运行任务的 Web Api 或 WCF【英文标题】:Wep Api or WCF to run scheduled long-running tasks 【发布时间】:2018-09-24 20:44:07 【问题描述】:

我正在开发一个客户端/服务器应用程序(C#,用于 GUI 的 Winforms)。 我们有一个模块来执行将数据从数据库导入/导出到其他外部源的任务。活动由使用任何客户端站的用户管理。下一步将是允许计划自动执行任务(例如,X 开始时间和每小时重复一次、每天或每周或每月时间等)。 每个任务都允许使用任何数据源(excel.access 或 dbms)导入或导出大量数据,因此它们是长期运行的活动。

现在实现此逻辑的 DLL 已分发到每个客户端站。这不是一个好的解决方案,因为我们必须在每个客户端中安装所有潜在需求(例如驱动程序 ado / oledb / odbc 用于所有托管 dbms)。

我必须将此逻辑移至服务器站。在每个客户端中,我想查看任务进度、停止或启动任何任务,或者更改调度表并重新启动进程。

我正在考虑什么是最好的解决方案。实现 Web API 或 WCF。可能是 WCF,因为它是面向服务的,但我见过将 Web API 与 Quartz 或 Hangfire 等库结合使用的项目或文章。 我也在考虑使用 Windows 服务 并在其中托管 WCF 是否更好。

什么是最好的解决方案?还是我没有考虑其他任何解决方案? 谢谢

编辑: 从任何客户端工作站,用户可以根据应用的设置(频率时间,每天/每周/每月重复)安排所有要执行的任务。可能我应该使用windows服务,因为当服务器机器自动打开时,这个服务必须自动启动并检查是否有任务要运行。同时,用户可以决定手动运行任何任务而不进行调度,在这种情况下,轮到他时将排队并处理。 现在我正在考虑将 WCF 服务托管到服务器机器中的 Windows 服务中。我将自动启动一个后台工作人员来检查要运行的计划任务。此外,所有客户端都可以调用一种方法来启动一个或多个任务。为了向所有客户通知进度,我将使用 Contract Duplex。

【问题讨论】:

你能发布你系统的拓扑吗?根据你的描述,很难看到。简而言之,Web API 和 WCF 是通信框架。如果您需要长时间运行的服务,则需要 Windows 服务。需要很长时间才能完成的任务与始终运行并等待工作的服务之间存在差异。您可以让 Windows 服务 24/7 在您的机器上运行,它可以非常快速地完成任务,并且您可以让 Web API 请求需要很长时间才能完成,因为工作需要很长时间才能完成。 我在正文中添加了其他信息。正如我在上面所写的,我的疑问是了解使用 WCF 开发所有内容还是通过制作 Web API 是否更好。如果我选择 Web API,我应该始终使用 Windows 服务托管还是使用 IIS?如果我使用网络服务器,我将遇到问题,即如何在不发出请求的情况下启动后台进程,但只要网络服务器启动。 【参考方案1】:

您需要根据您的要求比较 WCF 和 Web API 以及 Choosing which technology to use。

如果您只需要 HTTP 作为传输协议和轻量级网络托管服务,请使用 Web API。

我会推荐 Hangfire,因为它比 Windows 服务具有许多功能,例如分布式、持久性,此外,它是开箱即用的仪表板,可显示所有计划、处理、成功和失败的作业。

还请查看这篇关于 Runing Background Tasks in ASP.NET

【讨论】:

【参考方案2】:

如果这是一个内部应用程序并且客户端使用的是 winforms,那么您可以在后台获取/发布到 Web api 端点——这允许用户检索/导出数据而无需安装数据库驱动程序

web api 驱动 imo,对 windows 服务不是很熟悉,但我看到的好处之一是该服务在重新启动时仍然可以运行

欢迎直接联系我

【讨论】:

以上是关于用于运行调度程序长时间运行任务的 Web Api 或 WCF的主要内容,如果未能解决你的问题,请参考以下文章

为啥我对 web.api 的请求被长时间运行的控制器代码阻止?

带有队列的长时间运行的 REST API

ASP.NET Web API + 长时间运行的操作取消

长时间运行的后台任务完成后应用程序未挂起

带有异步或长时间运行任务的 UndoManager

在 nginx/gunicorn/django Web 架构中有效处理长时间运行的 HTTP 连接