2013-08-22 2 views
1

MVC4- 웹 사이트에서 사람들이 뭔가를하지 않았기 때문에 이메일로 경고를 받아야하는지 확인하려고합니다.MVC4에서 emaillist 비동기 처리

나는이 문제에 접근하는 방법을 찾는 데 어려움을 겪고 있습니다. 공유 호스팅 플랫폼에서 일종의 cronjob을 활성화 할 수 있는지 확인했지만 사용할 수 없습니다.

이제는 각 페이지 요청에 대해이 체크를 수행하는 것이 좋습니다. 오버 헤드 때문에 이미 차선책으로 보입니다. 하지만 비동기를 사용하면 사이트를 방문하는 사람들에게 방해가되지 않을 것이라고 생각했습니다.

먼저 Global.asax의 Application_BeginRequest 메서드에서이 작업을 시도했지만 페이지 요청 당 여러 번 호출되어 작동하지 않습니다.

다음으로 나는 OnResultExecuted에서 실행되는 글로벌 필터를 만들 수 있다는 것을 알았지 만 이는 유망한 것처럼 보였지만 여전히 문제가 아닙니다.

MVCMailer를 사용하여 메일을 보내고 실행할 때 오류가 발생합니다. { "값은 null 일 수 없습니다. \ r \ n 매개 변수 이름 : httpContext"} 이것은 아마도 메일러가 컨텍스트를 필요로 함을 의미합니다. 그렇다면

그래서
public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     base.OnResultExecuted(filterContext); 
     HandleEmptyProfileAlerts(); 

    } 
    private void HandleEmptyProfileAlerts() 
    { 
     new Thread(() => 
     { 
      bool active = false; 
      new UserMailer().AlertFirst("[email protected]").Send(); 
      DB db = new DB(); 
      DateTime CutoffDate = DateTime.Now.AddDays(-5); 
      var ProfilesToAlert = db.UserProfiles.Where(x => x.CreatedOn < CutoffDate && !x.ProfileActive && x.AlertsSent.Where(y => y.AlertType == "First").Count() == 0).ToList(); 
      foreach (UserProfile up in ProfilesToAlert) 
      { 
       if (active) 
       { 
        new UserMailer().AlertFirst(up.UserName).Send(); 
        up.AlertsSent.Add(new UserAlert { AlertType = "First", DateSent = DateTime.Now, UserProfileID = up.UserId }); 
       } 
       else 
        System.Diagnostics.Debug.WriteLine(up.UserName); 
      } 
      db.SaveChanges(); 

     }).Start(); 
    } 

내 질문에, 나는 이것에 대해 올바른 길을 가고, 그리고하고있다가, 어떻게 MVCMailer 가져 있는지 확인 할 수 있습니다

지금 내 글로벌 필터에서이 코드는이 다음이다 올바른 맥락?

답변

0

이런 종류의 일을 수행하는 일반적인 방법은 주기적으로 관심있는. 검사를 수행하는 하나의 배경 스레드를 가지고있다

당신은 위해 Application_Start에서 스레드를 시작할 것

(). 데이터베이스를 사용하여 작업 항목을 대기열에 저장하고 저장하는 것이 일반적이지만, 앱에서 더 좋은 경우 메모리에서 수행 할 수도 있습니다.