2011-11-20 38 views
1

我知道涉及计划任务runninng的模型,该模型在后台运行使用web请求注册的作业,但如何实现将所有内容都保存在ASP中的想法.net ...针对长时间运行的ASP.net MVC web请求设计

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

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

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

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

有什么想法?

干杯,伊恩。

+2

嗯,不是问题的完整答案,但你有没有看过[SignalR](https://github.com/SignalR/SignalR)项目。它是.Net持久连接实现的完美选择。 – tugberk

+0

这看起来很酷。我想我可以运行一个长时间运行的请求,并从服务器获取反馈。为什么网页浏览器不会超时? –

+0

为什么你需要保持在一个asp.net请求? – Dallas

回答

2

如果我找到你的权利,你实际上不需要任何后台作业和长时间运行的请求之间的“交互”,你只是想“招揽”后台作业与传入的请求?不是这样一个好主意。看看Quartz.NET项目,它是调度程序可嵌入到ASP.NET应用程序中,它将为您处理这些东西,而无需请求。当然,如果应用程序池关闭,您的调度程序也会关闭,但即使您的长时间运行的请求解决方案依赖于等待另一端的浏览器,也无法保证不会发生。

还采取从菲尔哈克有关这个主题的这个有趣的文章一看,用他自己的小计划程序库专用于ASP.NET:

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

1

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

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

+0

我想我会使用Windows Scheduler,所以我不会不需要重新实现定时器机制。另外,我可以将其配置为一次只运行一个实例,以便我不必担心数据库锁定。在此之前,我已经在服务和调度程序之间进行过辩论,我认为预定的exe是正确的选择。另外,如果我使用服务器端程序,那么我可能会插入数据,以便Web请求尽可能快 - 它只会创建一个“任务”行并将csv文件粘贴在其中。 –

+1

也许我只是使用Quartz.net。 –

+0

Quartz.net是运行预定后台任务的绝佳解决方案。很好的工作,你可以添加各种各样的东西,如耐用的工作,集群等。 –

0

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

+0

是的,这就是我现在要做的。 Web请求将作业传递给后台进程,然后仅调用状态报告。 –

相关问题