1

我正在尝试让我的 MVC4 网站检查是否应该通过电子邮件提醒人们,因为他们没有做任何事情。

我很难弄清楚如何解决这个问题。我检查了共享托管平台是否允许我激活某种 cronjob,但这不可用。

所以现在我的想法是对每个页面请求执行此检查,这似乎已经不是最佳的(因为开销)。但我认为使用异步不会妨碍人们访问该网站。

我首先尝试在 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 回答