我正在尝试让我的 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 获得正确的上下文?