수동으로 트리거하는 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.
라고합니다.
컨트롤러 컨텍스트가 새 스레드에서 더 이상 유효하지 않다는 사실과 관련이 있습니다. 확실하지 않습니다.
이렇게 접근하는 가장 좋은 방법은 무엇입니까? 내가 가질 수있는 대안은 무엇입니까?
감사
RazorEngine을 사용할 때 주된 문제처럼 보입니다. 자신 만의 롤링 없이는 MVC의 HtmlHelper 및 Partial 템플릿 해결에 액세스 할 수 없다는 것입니다. – crush