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

时间:2010-08-23 11:22:46

标签: asp.net wcf asynchronous

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

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

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

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

3 个答案:

答案 0 :(得分:2)

在我看来,你有三个选择

  1. 有一个长时间运行的页面,用户等待响应。如果这是几个小时,你会遇到很多可用性问题,所以我甚至都不会考虑它。
  2. 创建一个流程表来存储操作结果。异步运行服务功能并委派将结果记录到服务。可以有一个用户刷新的页面,它获取此表的最新结果。
  3. 如果您确实不想创建表,则将所有当前流程详细信息存储在用户的会话状态中,并具有上述当前流程页面。您可能会遇到会话可能超时的问题,或者Web应用可能会重新启动,您将失去所有这些。
  4. 我看不出2号是如此艰难。您可以使表格相当通用以包含所有类型的进程:进程详细信息可以编码为二进制或xml并由Web应用程序解释。然后,您就拥有了最强大的解决方案。

答案 1 :(得分:1)

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

您可以跟踪流程以查看流程,甚至在您有等待用户输入的步骤等时保留它。

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

http://www.codeproject.com/KB/WF/WF4Extensions.aspx可能有助于您更深入地了解相同内容。

答案 2 :(得分:1)

我认为你走在正确的轨道上。您应该异步运行该进程,将 execution 存储在某个地方(表),并保持正在运行的进程的状态。

您的用户应在流程执行时看到待处理显示标签,并在流程结束时看到已完成的标签。如果用户关闭了浏览器,她将在下次登录时看到其运行过程的结果。