MVC4 Web サイトをチェックして、何もしていないために電子メールで警告する必要があるかどうかを確認しようとしています。
私はこれにアプローチする方法を理解するのに苦労しています。共有ホスティング プラットフォームである種の cron ジョブを有効にできるかどうかを確認しましたが、これは利用できません。
したがって、私のアイデアは、各ページ要求でこのチェックを実行することです。これは、(オーバーヘッドのため) 既に最適ではないようです。しかし、非同期を使用すれば、サイトにアクセスするだけの人には邪魔にならないと思いました。
最初に Global.asax の Application_BeginRequest メソッドでこれを実行しようとしましたが、ページ要求ごとに複数回呼び出されるため、うまくいきませんでした。
次に、OnResultExecuted で実行されるグローバル フィルターを作成できることがわかりました。
問題は、MVCMailer を使用してメールを送信していて、実行すると次のエラーが表示されることです: {"Value cannot be null.\r\nParameter name: httpContext"} これはおそらく、メーラーが環境。
グローバルフィルターにあるコードは次のとおりです。
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
HandleEmptyProfileAlerts();
}
private void HandleEmptyProfileAlerts()
{
new Thread(() =>
{
bool active = false;
new UserMailer().AlertFirst("bla@bla.com").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 が正しいコンテキストを取得できるようにできますか?