Asp.net

ASP.NET MVC:新執行緒中的異常呈現視圖

  • August 17, 2012

我想在我的 ASP.NET 應用程序中創建一個手動觸發的程序,並將一堆電子郵件發送給我的使用者。由於這個過程需要一段時間,我正在創建一個新執行緒來發送這些消息並防止我的網路應用程序超時。(我知道如果應用程序池被回收或應用程序中有未處理的異常,這很容易出錯,但這是另一個主題)。

為此,我正在做這樣的事情:

public ActionResult SendMessages()
{
 Task.Factory.StartNew(() => { SendMessagesLongRunningProcess(); });
 return View();
}

在長期執行的過程中,我試圖呈現 HTML 電子郵件的視圖並發送它。像這樣:

private void SendMessagesLongRunningProcess()
{
 var users = GetUsers();
 foreach (var user in users)
 {
   string message = RenderView("EmailMessage", user);
   SendEmail(user.email, message);
 }
}

現在,我知道我的 RenderView 方法工作得很好,因為我使用它在其他地方呈現電子郵件視圖。問題是當我在這裡嘗試在新執行緒中執行它時。這是我的 RenderView 方法:

   public string RenderView(string viewName, object model)
   {
       ViewData.Model = model;
       using (var sw = new StringWriter())
       {
           var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null);
           var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
           viewResult.View.Render(viewContext, sw);
           return sw.GetStringBuilder().ToString();
       }
   }

我得到的錯誤是:

Value does not fall within the expected range.

當呼叫 viewResult.View.Render 方法時。

我猜這與控制器上下文在新執行緒中不再有效的事實有關,但我不確定。

那麼,解決這個問題的最佳方法是什麼?我有什麼選擇?

謝謝

我猜這與控制器上下文在新執行緒中不再有效的事實有關,但我不確定。

恰恰。

那麼,解決這個問題的最佳方法是什麼?

從另一個程序發送電子郵件,而不是您的 ASP.NET MVC 應用程序。

我有什麼選擇?

一種可能性是使用RazorEngine

private void SendMessagesLongRunningProcess()
{
   var users = GetUsers();
   foreach (var user in users)
   {
       string view = Server.MapPath("~/Views/MailTemplates/SomeTemplate.cshtml");
       string template = System.IO.File.ReadAllText(view);
       string message = Razor.Parse(template, user);
       SendEmail(user.email, message);
   }
}

您也可以MvcMailer非同步結帳和發送電子郵件(查看Send Email Asynchronously分步指南部分)。

引用自:https://stackoverflow.com/questions/11996205