处理 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 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败
ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败
是否可以在 ASP.NET MVC 的脚本块中引用 ViewData?