我有一个ASP.NET网站,用户在其中发出请求。每个请求都会启动一个可能需要几分钟的漫长过程(最差情况为20分钟)。在请求结束时,将创建一个文件供用户下载。
目前,我有异步启动此请求(使用异步页面)但我正在排除错误。我怀疑我的方法存在缺陷。为了使这个过程可扩展,我的下一个猜测是拥有一个执行长时间运行过程的Windows服务。当用户发出请求时,我会在数据库表中添加请求详细信息。 Win服务会选择并处理它。与此同时,用户被重定向到一个页面,要求他们在创建文件时等待。
这会是理想的方法吗?如果是这样,我是否每隔x分钟刷新页面以检查Windows服务是否已完成处理?
答案 0 :(得分:3)
答案 1 :(得分:1)
您可以使用Windows服务或后台线程。
Windows服务的优势在于您可能在远程计算机(“计算服务器”)上运行多个服务。
可以使用内存中的队列将消息传递给后台线程。使用服务,您应该使用更正式的消息传递系统,例如SQL Server的Service Broker。 Service Broker还处理持久性并提供一些清晰的扩展机制。
如果有帮助,我会在书中介绍Service Broker和后台主题,包括代码示例:Ultra-Fast ASP.NET。
答案 2 :(得分:0)
我过去必须做的是用户操作启动了漫长的过程,我会给数据库写一个“工作”,并带有状态。然后,该网站可以向用户显示该状态。
然后,您在服务器上运行一项服务,该服务监视该数据库表并执行长操作,并相应地更新状态。然后,该服务将创建文件或通过电子邮件发送给用户。
最后,该服务还必须考虑您希望该文件驻留在服务器上的时间。因此,如果您想在很长时间后删除它,则必须具有过期状态。
简而言之,是的,我认为你的方法存在缺陷。
答案 3 :(得分:0)
任何需要20分钟的任务都应该从ASP.NET进程中取出,然后卸载到域中的其他位置。以下是我在生产环境中使用的一些选项
如果您有权访问数据库服务器,那么在那里创建一个表,用户可以使用参数及其电子邮件地址对作业进行排队。然后创建一个DTS(SSIS SQL Server 2005-2008),它将每隔5-10分钟检查一次作业,执行并通过电子邮件发送结果。用户已经等了20分钟。
创建一个Windows服务,它将轮询一个作业队列(如上所述),然后执行,然后通过电子邮件向用户发送结果。
两种方式都需要一个作业队列,但是,用户只需提交作业然后继续。结果将发送到其邮箱,或者甚至作为存储在数据库中的二进制文档。
答案 4 :(得分:0)
我投票支持Windows服务方法,但也同意Clarence Klopfstein的评论,以便在网页上向用户显示工作状态。页面可以显示用户有权查看的所有作业的列表。如果该过程最多可能需要20分钟,请继续更新状态,以便用户看到进度。您可以使用一些JavaScript自动刷新页面。作业完成后显示文件的链接。
如果你想变得疯狂,可以写一些在生成文件时弹出一片吐司的AJAX - 在toast中包含一个指向该文件的链接。在网站的每个页面上都包含JavaScript段,以便用户无论身在何处都能收到通知。
-Krip
答案 5 :(得分:0)
这个问题是Message Queue的理想选择,你应该有一个Windows服务,它托管一个使用MSMQ作为传输的WCF服务,MSMQ将保证消息的传递,并且它也将保证不会丢失任何消息。服务失败或机器重启的情况。