2012-08-16 26 views
7

私は手動でトリガするASP.NETアプリケーションでプロセスを作成し、ユーザーに電子メールを送信します。このプロセスにはしばらく時間がかかりますので、これらのメッセージを送信する新しいスレッドを作成し、Webアプリケーションでタイムアウトが発生するのを防ぎます。 (これは、アプリケーションプールがリサイクルされている場合、またはアプリケーションに未処理の例外がある場合にはエラーが発生する可能性があることはわかっていますが、それは別の問題です)。私は、HTML形式の電子メールのビューをレンダリングし、それを送信しようとしている長時間実行されるプロセス内ASP.NET MVC:新しいスレッドで例外レンダリングビュー

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

:私はこのような何かをやっていることについては

。このように:今

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メソッドが呼び出されたとき。

これは、コントローラコンテキストが新しいスレッドで有効ではなくなったという事実と関係がありますが、わかりません。

これにはどのような方法が最適ですか?どのような選択肢がありますか?

おかげ

答えて

5

私は、これは、コントローラコンテキスト は新しいスレッドで有効もはやですが、私はよく分からないという事実に関係している推測しています。

正確に。

このアプローチにはどのような方法が最適ですか?

あなたの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セクションを見て)非同期でメールを送信することがあります。

+1

RazorEngineの主な問題点は、MVCのHtmlHelperとPartialテンプレート解決にアクセスすることができないことです。 – crush

関連する問題