2012-03-14 106 views
2

我有一个ASP.Net MVC Web应用程序,用户应该能够创建Excel报告。一些报告将需要大约15分钟才能创建。因此,我想要异步创建这些Excel文件,并在准备就绪时通过电子邮件发送它们。在ASP.Net中创建异步报告MVC

一旦用户发布了带有创建Excel文件请求的表单,用户应该会得到一个答案:“附带Excel文件的邮件将在15分钟内发送给您”。

你是如何做到这一点的?

回答

2

这是一个有点宽泛的问题,但对于.NET 4中的良好线程,您可以使用Task

您可以在控制器创建一个简单的动作:

[HttpPost] 
public ActionResult ExcelReport(ReportModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     ReportService reportCreator = new ReportService(); // or whatever class you use for that 
     Task.Factory.StartNew(() => reportCreator.GenerateReport(model)); 
     //redirect somewhere or return a plain view with your message 
     return View("ConfirmationMessage"); 
    } 
    return View(); 
} 

当然,你必须在一代中GenerateReport到底邮寄或走得更深,从GenerateReport方法火另一项任务。

这是所有服务器端完成的,如果你想有一个弹出窗口,你必须使用例如。 jQuery拦截表单提交,将模型传递到您选择的函数中,并在jQueryUI中为该消息使用弹出窗口。但这是一个偏好问题。 :)

+0

谢谢!我试过这个解决方案,它运作良好。 – Calluna 2012-03-14 13:50:31

1

在ASP.NET中后台工作的问题是,ASP.NET可以销毁AppDomain并随时创建一个新的(回收)。如果你的工作在运行时不知道的线程上运行,它们也将被销毁。

正常的解决方案是有一个单独的Windows服务进程负责后台工作。因为这是一个不同的过程,所以它不受ASP.NET的控制。

因此,您的网络应用程序发布了一个请求,以便在Web响应完成之前对服务执行一些工作。此通信通常使用服务中托管的WCF。

+0

谢谢!我现在已经使用Task.Factory.StartNew(...),只要AppDomain没有被销毁,它就会工作。当我有更多时间时,我会尝试使用WCF服务以正确的方式实现它。 – Calluna 2012-03-14 13:53:10