2015-09-01 24 views
1

目前我正在开发一个项目,其中一个网页将通过使用Web服务启动一个3小时的数据传输过程。基本上,Id的列表用于告诉Web服务将数据对象从一个数据库传输到另一个数据库。从服务器更新aspx页面

当我开始这个过程时,我想让用户保持控制。他必须能够看到当前进程有多远,并且能够按取消按钮来停止数据传输。所有这些都从ASPX网页运行。

我发现试图运行异步进程不允许我按照我的希望更新用户界面。只有当整个过程完成时我可能面对的另一个问题是,由于过程花费了大量时间,服务器对象可能会在某个时候刷新,这可能会导致我失去进度。

我目前正在决定是否使用Web服务器来处理数据传输。如果我是,我目前的解决方案是使用任务异步运行进程,并使用客户端Web调用(到aspx页面)来更新客户端界面。我也为我的工作对象实现IRegisteredObject接口。 IRegisteredObject explanation

任何关于如何最好地解决这个问题的想法是最受欢迎的。我真的很想知道我是否正朝着正确的方向前进。

+1

不,您不会在ASP.NET中执行长时间运行的后台任务,这是因为您找到的原因以及其他原因。你使用类似Windows服务的东西,例如WCF为IPC报告进度或取消操作。 http://stackoverflow.com/questions/28109449/launching-a-long-running-background-task-from-asp-net-or-a-scheduled-job, – CodeCaster

回答

1

我的建议是创建一个WCF服务,它不在ASP.NET中托管,并使您的ASP.NET应用程序调用该服务来触发执行数据传输的长时间运行的作业。与此同时,您的ASP.NET应用程序会通知用户它已经触发了该作业,并且您可以公开您的服务上的其他端点,ASP.NET应用程序可以通过用户请求查询其他端点以提取并报告进度。

1

Web服务器一次只能为每个用户运行一个页面,因此如果您想在进程运行时与浏览器通信,则无法从请求运行进度。您需要将其作为独立的后台线程启动,以便您可以完成启动该进程的请求。

之后,您可以向服务器发送请求,以便对进程的状态进行轮询或控制进程。

如果可能,您应该完全在IIS之外运行该进程,例如作为控制台应用程序。这样,您只需跟踪Web应用程序中正在运行的进程的事实,例如将其放入数据库中,以便它能够在IIS中循环使用。