【问题标题】:tools for running background tasks in asp.net mvc web application在 asp.net mvc web 应用程序中运行后台任务的工具
【发布时间】:2015-09-08 17:06:29
【问题描述】:

我对在 asp.net mvc Web 应用程序中执行后台和长时间运行任务的正确设计决策感到困惑。现在在这两个链接上:-

http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

&

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/

他们提到在 asp.net Web 应用程序中运行后台任务和长时间运行的任务是有风险的,原因是他们列出的(主要是因为 IIS 不是为运行这些类型的任务而设计的)。但同时他们列出了一些可以安装在 asp.net 项目中以运行后台作业的工具,例如quartz.net、WebBackgrounder 等。

所以我不确定这些工具是如何工作的?例如,如果我将 WebBackgrounder 安装在我的 asp.net mvc Web 应用程序中(使用 nuget),并且我在 IIS 中部署我的 asp.net mvc Web 应用程序,那么这些工具中定义的作业也会在 IIS 下运行吗?或者它们将独立于托管 Web 应用程序的 II 运行?

【问题讨论】:

    标签: asp.net asp.net-mvc iis quartz.net hangfire


    【解决方案1】:

    它们将在 IIS 上运行,但在不同的线程中。你需要达到什么目标?也许您正试图在错误的地方解决问题。考虑使用消息队列将此任务与您的 Web 应用程序分离。然后,构建一个服务来使用队列中的消息并计算您需要的内容。

    这是一个使用 azure 服务总线和辅助角色的示例,但您可以在本地使用相同的想法:

    http://www.asp.net/aspnet/overview/developing-apps-with-windows-azure/building-real-world-cloud-apps-with-windows-azure/queue-centric-work-pattern

    【讨论】:

    • 感谢您的帮助.. 关于我想要实现的是我有一种方法可以扫描我们的网络以查找服务器和虚拟机并更新我们的数据库,该方法还运行一些电源外壳和电源 cli扫描网络的脚本。扫描可能需要大约 10-15 分钟才能完成。现在我习惯将此方法作为我的 asp.net mvc 中的操作方法,可以从 Web 浏览器调用,也可以根据 global.asax 中的定义及时调用。
    • 但是从我的阅读和搜索中我发现在一个动作方法中运行如此长时间的任务并不是最好的方法。所以我虽然使用诸如quartz.net 或webbackgrounder 之类的工具是可以遵循的……所以你能建议吗?现在正如我所说,目前我将此作为一种操作方法,可以手动启动,也可以按照 global.asax 文件中的定义及时启动..
    • 那么,您从您的 asp.net 应用程序启动 powershell 命令,就这样吗?我仍然建议您将此过程与您的 webapp 分离。例如,从 asp.net 启动它们,但您不需要等到它结束。更改您的 powershell 进程以在队列中插入消息或类似的内容,以便在完成时通知您。
    • 感谢您的回复,但我的操作方法首先将使用 WebClient 连接到第三方工具 API 以获取扫描凭据(用户名和密码)。之后会执行powercli脚本,最后根据powercli脚本结果(如服务器网络信息)更新数据库,系统也提供两种扫描方式,根据时间间隔运行全扫描或手动(仅在某些情况下),或者您可以选择仅扫描特定服务器,所以我需要等待扫描结束..
    • 我确实理解将扫描作为单独的 .exe 进程更为稳健,但在此链接上,例如 haacked.com/archive/2011/10/16/…,他们列出了如何提高执行长时间运行的稳健性asp.net 中的任务(当然仍然将其作为一个单独的进程是最好的方法),但我试图找到最适合我的方法,因为我之前没有编写任何 Windows 服务......
    【解决方案2】:

    如果您在 IIS 中运行 Quartz.Net,那么您将遇到 IIS 定期终止应用程序的相同问题。当他们提到使用 Quartz.Net 时,他们的意思是您将 Quartz.Net 安装为 Windows 服务。然后,您的应用程序与在服务内运行的 Quartz.Net 服务器对话,并安排作业在其上运行。然后服务器/服务为您运行作业,您不会遇到在 IIS 内运行的问题,因为您的作业正在服务内运行。

    没有可以作为 Windows 服务安装的 Quartz.Net nuget 服务器包。为此,您必须下载源代码并自己构建它或download the binaries from SourceForge。 Quartz.Net nuget 包用于将作业从 Web 应用程序调度到 Quartz.Net 服务器。

    【讨论】:

    • 似乎这对我来说是一个新领域,所以要遵循推荐的方法,我必须将我的 asp.net mvc 操作方法转换为 Windows 服务,这是正确的吗?如果是,那么我可以在 Windows 服务中使用实体框架,使用 webclient,像我目前在我的操作方法中所做的那样运行 powercli 脚本吗?
    • 你可以在服务中运行几乎任何你想要的东西。需要注意的一件事是,它是与您的 Web 应用程序分开的进程,因此您无法访问您在操作中可用的任何进程内变量或上下文。
    • 谢谢你的意思,那么我将如何处理这个限制?
    • 您需要一个存放共享数据的地方。可以是数据库、队列或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-09-29
    • 2018-11-21
    • 1970-01-01
    • 2016-05-04
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多