在ASP.Net MVC中创建异步报表
本文关键字:创建 异步 报表 MVC ASP Net | 更新日期: 2023-09-27 18:27:48
我有一个ASP.Net MVC web应用程序,用户应该能够在其中创建Excel报告。创建某些报告大约需要15分钟。因此,我想异步创建这些Excel文件,并在它们准备好后通过电子邮件发送。
一旦用户发布了带有创建Excel文件请求的表格,用户应该会得到一个答案,上面写着"带有Excel文件的邮件将在大约15分钟内发送给您。"
你是怎么做到的?
这是一个有点宽泛的问题,但为了在.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。