在ASP.Net MVC中创建异步报表

本文关键字:创建 异步 报表 MVC ASP Net | 更新日期: 2023-09-27 18:27:48

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

一旦用户发布了带有创建Excel文件请求的表格,用户应该会得到一个答案,上面写着"带有Excel文件的邮件将在大约15分钟内发送给您。"

你是怎么做到的?

在ASP.Net MVC中创建异步报表

这是一个有点宽泛的问题,但为了在.NET4中实现良好的线程处理,您可以使用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方法中激发另一个Task。

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

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

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

因此,您的web应用程序会在web响应完成之前向服务发布一个做一些工作的请求。此通信通常使用服务中托管的WCF。