1

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 が正しいコンテキストを取得できるようにできますか?

4

1 に答える 1

0

この種のことを行う通常の方法は、関心のあるチェックを定期的に実行する単一のバックグラウンド スレッドを用意することです。

Application_Start() からスレッドを開始します。データベースを使用して作業項目をキューに入れたり保存したりするのが一般的ですが、アプリにとってより良い場合はメモリ内で行うこともできます。

于 2013-09-19T02:19:42.040 に答える