在浏览器关闭后保持我的Web应用程序运行

时间:2009-03-14 08:01:05

标签: asp.net browser keep-alive

我有一个aspx Web应用程序,用于更新或添加数据库中的文件。客户端通过浏览器访问,其中一个要求是,他们可以启动更新,并能够在更新继续时关闭浏览器。关闭浏览器后它似乎运行了一段时间然后停止了。如何让应用程序继续运行asp.net?

5 个答案:

答案 0 :(得分:3)

使用WF (Workflow Foundation)可以很好地解决这个问题。为关闭浏览器的任务创建一个工作流程。工作流有自己的线程和活动周期与ASP.NET分开。

答案 1 :(得分:1)

Web应用程序将继续在应用程序池中运行,但最终会被回收。只要用户会话运行,应用程序就应该保持活动状态,因此通过提高会话超时,您可以解决问题。

更好的方法是将长期运行的任务转移到服务中,但这可能需要重写您的应用程序。

答案 2 :(得分:1)

通常,对于长时间运行或异步处理,您希望将请求分派给后端服务进行处理。尝试保持web应用程序活着以完成处理可能会导致问题,尤其是HTTP和会话超时。

一种常见的模式是将请求放在消息队列上,让后端服务尽可能地处理它。

答案 3 :(得分:0)

我会创建一个单独的Windows服务,您可以从Web应用程序中将作业推送到其中,然后在用户再次登录时检查作业的状态。

Windows服务不会绑定到asp.net应用程序域,因此无论Web应用程序中发生什么,它都将继续运行。

答案 4 :(得分:0)

我遇到了这种模式,你必须将工作与HTTP请求分离。我们解决它的方法是将计算抽象为要安排的事件。因此,假设浏览器中的用户采取需要在后端进行长时间(相对)计算的操作,此计算被赋予类似'doXYZForUser'的名称,并给出一个参数向量,如(userId,params ...)和被送到工作队列。将来有一段时间用户会再次登录,并可以看到他们的工作状态。

我正在运行Java堆栈和Java消息服务(JMS),但原理是相同的。来自浏览器的请求将事件排队,浏览器返回ACK,说明事件在工作队列中。该队列由一个完全独立运行的进程管理,在.NET中我认为它只是称为Message Queue。队列处理完成后,可以将结果放在一个单独的表中,该表包含对启动作业的用户的引用,因此下次登录作业状态/结果时可以返回。