私は手動でトリガする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メソッドが呼び出されたとき。
これは、コントローラコンテキストが新しいスレッドで有効ではなくなったという事実と関係がありますが、わかりません。
これにはどのような方法が最適ですか?どのような選択肢がありますか?
おかげ
RazorEngineの主な問題点は、MVCのHtmlHelperとPartialテンプレート解決にアクセスすることができないことです。 – crush