2012-08-16 2 views
7

수동으로 트리거하는 ASP.NET 응용 프로그램에서 프로세스를 만들고 사용자에게 전자 메일을 보내려고합니다. 이 프로세스는이 메시지를 보내고 내 웹 응용 프로그램에서 시간 초과를 방지하는 새로운 스레드를 만드는 동안 시간이 걸립니다. (나는 이것이 애플 리케이션 풀이 리사이클되거나 애플 리케이션에 처리되지 않은 예외가있는 경우에 에러가 발생하기 쉽다는 것을 알고있다. 그러나 그것은 또 다른 주제이다). 이를 위해 ASP.NET MVC : 새 스레드에서 예외 렌더링보기

나는 이런 식으로 뭔가를하고 있어요 :

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

내가지고있어 오류는 다음 viewResult.View.Render 방법이

Value does not fall within the expected range. 

라고합니다.

컨트롤러 컨텍스트가 새 스레드에서 더 이상 유효하지 않다는 사실과 관련이 있습니다. 확실하지 않습니다.

이렇게 접근하는 가장 좋은 방법은 무엇입니까? 내가 가질 수있는 대안은 무엇입니까?

감사

답변

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