【问题标题】:ASP.NET MVC: Exception rendering view in new threadASP.NET MVC:新线程中的异常呈现视图
【发布时间】:2012-08-13 08:04:13
【问题描述】:

我想在我的 ASP.NET 应用程序中创建一个手动触发的进程,并向我的用户发送一堆电子邮件。由于此过程需要一段时间,我正在创建一个新线程来发送这些消息并防止在我的 Web 应用程序中出现超时。 (我知道如果应用程序池被回收或应用程序中有未处理的异常,这很容易出错,但这是另一个主题。

为此,我正在做这样的事情:

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 asp.net-mvc view multithreading


    【解决方案1】:

    我猜这与控制器上下文有关 在新线程中不再有效,但我不确定。

    没错。

    那么,解决这个问题的最佳方法是什么?

    从另一个进程发送电子邮件,而不是您的 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 部分)。

    【讨论】:

    • 似乎使用 RazorEngine 的主要问题是您无法访问 MVC 的 HtmlHelper 和 Partial 模板解析而不滚动您自己的。
    猜你喜欢
    • 2011-07-24
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多