设计长期运行的ASP.net MVC Web请求

时间:2011-11-20 10:26:33

标签: asp.net-mvc jquery web batch-processing

我知道这个模型涉及在后台运行的计划任务,该任务运行在Web请求中注册的作业,但是如何将这一点保存在ASP.net中...

  1. 用户上传的CSV文件可能有几千行。行被持久化到数据库。我想这可能需要一分钟左右,这是一个可以接受的等待。

  2. 请求返回到浏览器,然后自动Ajax请求将返回到服务器并请求,例如,一次请求10行并处理它们。 (每行需要许多Web服务请求。)

  3. Ajax调用返回,显示更新,然后另一个自动Ajax请求返回更多行。这将重复,直到所有行都完成。

  4. 如果用户离开网页,他们可以返回并重新启动作业。

  5. 有什么想法吗?

    干杯,伊恩。

3 个答案:

答案 0 :(得分:2)

如果我说得对,你实际上不需要在后台作业和长时间运行的请求之间进行任何“交互”,你只是想用传入的请求“lauch”后台作业?不是一个好主意。看看Quartz.NET项目,它是嵌入到ASP.NET应用程序中的调度程序,它将为您处理这些内容而无需请求。当然,如果有app pool关闭,你的调度程序也会关闭,但是你不能保证即使你的长期运行请求解决方案也不会发生,这取决于浏览器在另一边等待。

另请参阅phil haack关于此主题的这篇有趣的文章,以及他自己的专门针对ASP.NET的小调度程序库:

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

答案 1 :(得分:1)

服务器端程序(或理想的服务)仍然可以快速而且脏,并且更可靠。您仍然可以按照建议执行步骤1,上传文件并插入数据(不要忘记在web.config中增加maxRequestLength超时值)。然后在服务器上运行一个程序,检查新记录并处理它们。

如果用户需要状态,您可以在数据库中为每个文件存储一个条目,并在导入完成后更新数据库记录。

答案 2 :(得分:0)

也许我正在阅读这个问题并以一种奇怪的方式解释它,但为什么你不能将文件读入数据库并在表格中存储你所在的文件的当前行。通过完成。然后,您可以通过数据库跟踪您的进度,并发送小的json对象,告诉用户您的距离。这样,如果他们的连接断开,您可以继续处理他们的请求,如果他们稍后返回,您可以通知他们工作的距离。此外,如果多个客户端正在连接,您可以使用db来排队和限制(通过序列化)工作负载。或者,如果用户将中间作业与另一个文件连接起来,那么他们的新请求将在当前作业之后排队。