Ошибка захвата, если она возникает
Как это сделать, если есть какая-либо ошибка (любая), чтобы зафиксировать эту ошибку и записать в журнал..
Недавно клиент изменил пароль веб-мастера (электронная почта использовалась для аутентификации отправленных сообщений). Это означало, что система больше не могла отправлять электронные письма. Проблема в том, что ошибка не была обнаружена несколько дней спустя.
Хотели бы вы, чтобы способ отловить эту ошибку и сохранить сообщение (электронную почту) и журнал ошибок, как?
В контроллере
new MailController(_subsidiaryService).PedidoOrcamentoEmail(model).DeliverAsync();
в MailController
public EmailResult PedidoOrcamentoEmail(BudgetViewModel model)
{
From = string.Format("{0} <{1}>", model.Name, model.Email);
To.Add("Site <" + ConfigurationManager.AppSettings["toEmail"] + ">");
var subInfo = (from s in _subsidiaryService.Repository.Query()
where s.ID == model.SubsidiaryID
select new
{
s.Title,
s.District
}).SingleOrDefault();
ViewData["SubsidiaryTitle"] = subInfo.Title;
ViewData["SubsidiaryDistrict"] = subInfo.District;
Subject = "[Pedido de Orçamento] " + model.Name;
return Email("PedidoOrcamentoEmail", model);
}
protected override void OnException(System.Web.Mvc.ExceptionContext filterContext)
{
// This is not executed
base.OnException(filterContext);
}
В качестве теста я ввел неверный пароль электронной почты веб-мастера (используется для доставки)
1 ответ
Создайте пользовательский MailSender, который наследуется от MailSender по умолчанию, и оберните вызовы базовых методов в блоки try..catch. Тогда вы можете делать что угодно, за исключением тех случаев, когда это происходит.
public class CustomMailSender : SmtpMailSender
{
private readonly ILog _log = LogManager.GetCurrentClassLogger();
public CustomMailSender() { }
public CustomMailSender(SmtpClient client) : base(client) { }
public new void Send(MailMessage mail)
{
try
{
base.Send(mail);
//Do some logging if you like
_log.Info(....)
}
catch (SmtpException e)
{
//Do some logging
var message = mail.RawMessageString();
_log.Error(message, e);
// rethrow if you want...
}
}
public new void SendAsync(MailMessage mail, Action<MailMessage> callback)
{
... similar ...
}
}
В вашем MailController используется CustomMailSender следующим образом:
public MailController() {
MailSender = new MyCustomMailSender();
}