1

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

4

5 回答 5

3

这是您可以通过WF (Workflow Foundation)很好地解决的问题。为应该在关闭浏览器后仍然存在的任务创建工作流。工作流有自己的线程和独立于 ASP.NET 的生命周期。

于 2009-03-14T08:05:04.687 回答
1

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

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

于 2009-03-14T08:06:34.840 回答
1

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

一种常见的模式是将请求放在消息队列中,并让后端服务在可能的情况下处理它。

于 2009-03-14T08:08:13.433 回答
0

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

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

于 2009-03-14T08:05:30.320 回答
0

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

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

于 2009-03-14T08:37:09.960 回答