2012-08-16 33 views
7

Tôi muốn tạo một quy trình trong ứng dụng ASP.NET mà tôi kích hoạt theo cách thủ công và sẽ gửi một loạt email cho người dùng của mình. Vì quá trình này diễn ra trong khi tôi đang tạo một chuỗi mới để gửi các thư này và ngăn việc có thời gian chờ trong ứng dụng web của tôi. (Tôi biết đây là lỗi dễ xảy ra trong trường hợp hồ bơi ứng dụng được tái chế hoặc có một ngoại lệ không được giải quyết trong ứng dụng, nhưng đó là một chủ đề khác).ASP.NET MVC: Giao diện kết xuất ngoại lệ trong chủ đề mới

Cho rằng tôi đang làm một cái gì đó như thế này:

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

bên trong quá trình chạy dài Tôi đang cố gắng để làm cho cấu hình riêng cho email HTML và gửi đi. Như thế này:

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

Bây giờ, tôi biết rằng phương pháp RenderView của tôi hoạt động tốt vì tôi sử dụng nó để hiển thị chế độ xem email ở những nơi khác. Vấn đề là khi tôi cố gắng thực hiện nó trong một chủ đề mới như tôi đang làm ở đây. Đây là phương pháp RenderView tôi:

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(); 
     } 
    } 

Các lỗi tôi nhận được là:

Value does not fall within the expected range. 

Khi phương pháp viewResult.View.Render được gọi.

Tôi đoán điều này có liên quan đến thực tế là ngữ cảnh bộ điều khiển không còn hợp lệ trong chuỗi mới nữa, nhưng tôi không chắc chắn.

Vì vậy, cách tốt nhất để tiếp cận điều này là gì? Tôi có những lựa chọn thay thế nào?

Cảm ơn

Trả lời

5

Tôi đoán này đã làm với thực tế là bộ điều khiển bối cảnh không còn giá trị trong các chủ đề mới, nhưng tôi không chắc chắn.

Chính xác.

Vì vậy, cách tốt nhất để tiếp cận điều này là gì?

Gửi email từ một quy trình khác chứ không phải ứng dụng ASP.NET MVC của bạn.

Tôi có những lựa chọn thay thế nào?

Một khả năng là sử dụng 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); 
    } 
} 

Bạn cũng có thể kiểm MvcMailer và gửi email không đồng bộ (hãy nhìn vào phần Send Email Asynchronously của bước hướng dẫn step-by-).

+1

Có vẻ như vấn đề chính với việc sử dụng RazorEngine là bạn không có quyền truy cập vào độ phân giải mẫu HtmlHelper và Partial của MVC mà không cần phải tự cuộn. – crush

Các vấn đề liên quan