Ошибка захвата, если она возникает

Как это сделать, если есть какая-либо ошибка (любая), чтобы зафиксировать эту ошибку и записать в журнал..

Недавно клиент изменил пароль веб-мастера (электронная почта использовалась для аутентификации отправленных сообщений). Это означало, что система больше не могла отправлять электронные письма. Проблема в том, что ошибка не была обнаружена несколько дней спустя.

Хотели бы вы, чтобы способ отловить эту ошибку и сохранить сообщение (электронную почту) и журнал ошибок, как?

В контроллере

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();
}
Другие вопросы по тегам