处理 ASP.NET 中长时间运行的进程

Posted

技术标签:

【中文标题】处理 ASP.NET 中长时间运行的进程【英文标题】:Dealing with Long running processes in ASP.NET 【发布时间】:2010-08-23 11:22:46 【问题描述】:

我想知道处理从 ASP.NET 网页按需启动的长时间运行进程的最佳方法。

该过程可能包含多个步骤(例如将文件上传到服务器、在其上运行 SSIS 包、执行一些存储过程等),有时该过程可能需要几个小时才能完成。

如果我使用 WCF 服务进行异步执行,那么如果用户在进程运行时关闭浏览器会发生什么情况,应该如何向用户显示进程成功或失败结果?为了解决这个问题,我选择了单向 WCF 服务调用,但问题是我需要创建一个进程表并将结果(如果它在任何步骤中失败以及哪些步骤已成功完成,则存储结果)该表是一个额外的开销,因为有许多这样的进程以及用户可以从网页调用的各种步骤,并且用户需要了解进度(在最简单的情况下,状态可以是“进程 xyz 正在运行”)完成后,需要向用户显示输出(例如通过运行存储过程)。

为此设计解决方案的最佳方法是什么?

【问题讨论】:

【参考方案1】:

在我看来,你有三个选择

    有一个长时间运行的页面,用户在其中等待响应。如果这是几个小时,你会遇到很多可用性问题,所以我什至不会考虑。 创建一个进程表来存储操作的结果。异步运行服务功能并将记录结果委托给服务。用户刷新的页面可能会获取该表的最新结果。 如果你真的不想建表,那么把所有当前进程的详细信息存储在用户的会话状态中,并有一个如上的当前进程页面。您可能会遇到会话可能会超时的问题,或者网络应用可能会重新启动,而您将失去所有这些。

我看不出 2 号有这么大的困难。您可以使该表相当通用以包含所有类型的流程:流程详细信息可以只编码为二进制或 xml 并由 Web 应用程序解释。这样您就有了最强大的解决方案。

【讨论】:

感谢所有回复。我需要构建的更像是一个小型作业执行管理工具,由 Web 界面触发,这并不常见。我可能会创建一个通用进程表并将日志消息存储为 xml。日志信息主要表示执行进度。【参考方案2】:

我不能说最好的方法是什么,但将 Windows Workflow Foundation 用于如此长时间运行的进程绝对是一种方法。

您可以跟踪流程以查看它处于哪个阶段,如果您有等待用户输入的步骤等,甚至可以保留它。

WF 提供了许多开箱即用的功能(特别是如果您的存储介质是 SQL Server),并且可能是一个不错的选择。

http://www.codeproject.com/KB/WF/WF4Extensions.aspx 可能会帮助您更深入地了解这一点。

【讨论】:

【参考方案3】:

我认为你是在正确的轨道上。您应该异步运行进程,将 执行 存储在某处(表),并将运行进程的状态保存在那里。

您的用户应该在进程执行时看到一个 pending 显示标签,并在进程完成时看到一个带有结果的 finished 标签。如果用户关闭了浏览器,下次登录时会看到自己运行进程的结果。

【讨论】:

以上是关于处理 ASP.NET 中长时间运行的进程的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core与ASP.NET区别

ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败

ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败

是否可以在 ASP.NET MVC 的脚本块中引用 ViewData?

在VS2010 ASP.NET开发服务器上运行新的MVC3解决方案;会员数据库在哪里?

ASP.NET Core 6框架揭秘实例演示[05]:依赖注入基本编程模式