我有一个ASP.Net MVC Web应用程序,用户应该能够创建Excel报告。一些报告将需要大约15分钟才能创建。因此,我想要异步创建这些Excel文件,并在准备就绪时通过电子邮件发送它们。在ASP.Net中创建异步报告MVC
一旦用户发布了带有创建Excel文件请求的表单,用户应该会得到一个答案:“附带Excel文件的邮件将在15分钟内发送给您”。
你是如何做到这一点的?
我有一个ASP.Net MVC Web应用程序,用户应该能够创建Excel报告。一些报告将需要大约15分钟才能创建。因此,我想要异步创建这些Excel文件,并在准备就绪时通过电子邮件发送它们。在ASP.Net中创建异步报告MVC
一旦用户发布了带有创建Excel文件请求的表单,用户应该会得到一个答案:“附带Excel文件的邮件将在15分钟内发送给您”。
你是如何做到这一点的?
这是一个有点宽泛的问题,但对于.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中为该消息使用弹出窗口。但这是一个偏好问题。 :)
在ASP.NET中后台工作的问题是,ASP.NET可以销毁AppDomain并随时创建一个新的(回收)。如果你的工作在运行时不知道的线程上运行,它们也将被销毁。
正常的解决方案是有一个单独的Windows服务进程负责后台工作。因为这是一个不同的过程,所以它不受ASP.NET的控制。
因此,您的网络应用程序发布了一个请求,以便在Web响应完成之前对服务执行一些工作。此通信通常使用服务中托管的WCF。
谢谢!我现在已经使用Task.Factory.StartNew(...),只要AppDomain没有被销毁,它就会工作。当我有更多时间时,我会尝试使用WCF服务以正确的方式实现它。 – Calluna 2012-03-14 13:53:10
谢谢!我试过这个解决方案,它运作良好。 – Calluna 2012-03-14 13:50:31