1

如果有任何错误(任何人)来捕获此错误并写入日志,该怎么做..

最近一个客户更改了密码 webmaster(用于验证发送消息的电子邮件)这意味着系统不再能够发送电子邮件。问题是几天后没有发现错误。

您想要一种方法来捕获此错误并保存消息(电子邮件)和日志错误,如何?

在控制器中

new MailController(_subsidiaryService).PedidoOrcamentoEmail(model).DeliverAsync();

在邮件控制器中

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);
            }

作为测试,我输入了一个无效的密码电子邮件网站管理员(用于运输)

4

1 回答 1

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();
}
于 2013-05-06T12:25:30.577 回答