gpt4 book ai didi

asp.net-mvc - ASP.Net MVC异常记录与错误处理结合

转载 作者:行者123 更新时间:2023-12-03 11:41:14 25 4
gpt4 key购买 nike

我正在寻找一种简单的解决方案来在我的ASP.Net MVC 1.0应用程序中进行异常记录与错误处理相结合。

我已经阅读了很多文章,包括在StackOverflow上发布的问题,它们都为不同情况提供了不同的解决方案。我仍然无法提出适合我需要的解决方案。

这是我的要求:

  • 为了能够在我的Controller上使用[HandleError]属性(或等效的东西),处理所有可能从任何Action或View抛出的异常。这应该处理所有未在任何操作上明确处理的异常(如第2点所述)。对于Controller中的所有操作,我希望能够指定在错误情况下必须将用户重定向到哪个View。
  • 我希望能够在特定操作的顶部指定[HandleError]属性(或等效项),以捕获特定异常并将用户重定向到适合该异常的View。所有其他异常仍必须由Controller上的[HandleError]属性处理。
  • 在以上两种情况下,我都希望使用log4net(或任何其他日志记录库)记录异常。

  • 如何实现以上目标?我已经读过有关使我的所有Controller都继承自覆盖OnException方法的基本 Controller 的信息,并且在其中进行日志记录。但是,这将使用户重定向到适当的 View ,或使其变得困惑。

    我已经读过有关编写自己的实现IExceptionFilter的Filter Action的信息,但这将与[HandleError]属性发生冲突。

    到目前为止,我的想法是最好的解决方案是编写从HandleErrorAttribute继承的我自己的属性。这样,我可以获得[HandleError]的所有功能,并且可以添加自己的log4net日志记录。解决方法如下:
        public class HandleErrorsAttribute: HandleErrorAttribute {

    private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public override void OnException(ExceptionContext filterContext)
    {
    if (filterContext.Exception != null)
    {
    log.Error("Error in Controller", filterContext.Exception);
    }

    base.OnException(filterContext);
    }
    }

    上面的代码可以满足我的要求吗?如果没有,哪种解决方案可以满足我的要求?

    最佳答案

    我仍然对所有不同的解决方案以及属性如何相互干扰感到困惑,但是我采用了以下解决方案:

    public class LogErrorsAttribute: FilterAttribute, IExceptionFilter
    {
    #region IExceptionFilter Members

    void IExceptionFilter.OnException(ExceptionContext filterContext)
    {
    if (filterContext != null && filterContext.Exception != null)
    {
    string controller = filterContext.RouteData.Values["controller"].ToString();
    string action = filterContext.RouteData.Values["action"].ToString();
    string loggerName = string.Format("{0}Controller.{1}", controller, action);

    log4net.LogManager.GetLogger(loggerName).Error(string.Empty, filterContext.Exception);
    }

    }

    #endregion
    }

    我仍然按照原始问题中的说明使用[HandleError]属性,我只是用[LogErrors]属性装饰了每个 Controller 。

    这对我有用,因为它可以将错误记录在一个位置,并且不会导致重复的异常被记录多次(如果我扩展[HandleError]并在多个位置使用该属性,则会发生这种情况)。

    我认为不可能将异常日志记录和错误处理结合到一个属性或类中,而不会变得非常繁琐和复杂,或者不会影响[HandleError]的使用

    但这对我有用,因为我只用[LogErrors]属性装饰了每个 Controller 一次,并按照我想要的方式用[HandleError]装饰了 Controller 和 Action ,而又不会互相干扰。

    更新:

    这是我如何使用它的示例:
    [LogErrors(Order = 0)]
    [HandleError(Order = 99)]
    public class ContactController : Controller
    {
    public ActionResult Index()
    {
    return View(Views.Index);
    }

    public ActionResult Directions()
    {
    return View(Views.Directions);
    }


    public ActionResult ContactForm()
    {
    FormContactMessage formContactMessage = new FormContactMessage();

    return View(Views.ContactForm,formContactMessage);
    }

    [HandleError(ExceptionType = typeof(SmtpException), View = "MessageFailed", Order = 1)]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ContactForm(FormContactMessage formContactMessage)
    {
    if (ModelState.IsValid)
    {
    if (formContactMessage.IsValid)
    {
    SmtpClient client = new SmtpClient();

    MailAddress recipientAddress = new MailAddress(Properties.Settings.Default.ContactFormRecipientEmailAddress);
    MailAddress senderAddress = new MailAddress(Properties.Settings.Default.ContactFormSenderEmailAddress);
    MailMessage mailMessage = formContactMessage.ToMailMessage(recipientAddress, senderAddress);

    client.Send(mailMessage);

    return View("MessageSent");
    }
    else
    {
    ModelState.AddRuleViolations(formContactMessage.GetRuleViolations());
    }
    }
    return View(Views.ContactForm, formContactMessage);
    }

    private static class Views
    {
    public static string Index { get { return "Index"; } }
    public static string Directions { get { return "Directions"; } }
    public static string ContactForm { get { return "ContactForm"; } }

    }
    }

    在上面的代码中, ContactForm操作重载中的SmtpExceptions以非常特定的方式处理-向用户显示特定于失败的已发送消息的ViewPage,在这种情况下,它称为“MessageFailed”。所有其他异常均由[HandleError]的默认行为处理。还要注意,首先记录错误,然后处理错误。这由以下指示:
    [LogErrors(Order = 0)]
    [HandleError(Order = 99)]

    更新:

    有一个很好的解释,可以替代此方法。我建议通读它,以更好地理解所涉及的问题。

    ASP.NET MVC HandleError Attribute, Custom Error Pages and Logging Exceptions
    (感谢下面的Scott Shepherd,他在下面的答案中提供了链接)。

    关于asp.net-mvc - ASP.Net MVC异常记录与错误处理结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1032373/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com