asp.net-mvc – ASP.Net MVC异常记录与错误处理相结合
|
我在ASP.Net MVC 1.0应用程序中寻找一个简单的解决方案来执行异常记录和错误处理。 我读过很多文章,包括StackOverflow上发布的问题,这些都为不同情况提供了不同的解决方案。我仍然无法提出一个适合我需要的解决方案。 这是我的要求: >为了能够在我的Controller上使用[HandleError]属性(或者相当于某些东西)来处理可以从任何动作或视图抛出的所有异常。这应该处理在任何操作上没有特别处理的所有异常(如第2点所述)。我想指定哪个View用户必须重定向到错误的情况下,对于Controller中的所有操作。 如何实现上述目标?我已经阅读了关于使我所有的控制器继承自一个基本控制器,它覆盖了OnException方法,其中我做了我的日志记录。但是,这会让用户重定向到相应的视图,或使其变得混乱。 我已经阅读过关于编写我自己的Filter Action,它实现了IExceptionFilter来处理这个问题,但这会与[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]属性来装饰每个控制器。 这对我来说是有效的,因为它将错误日志记录保存在一个地方,并且不会导致重复的异常被多次记录(如果我扩展[HandleError]并在多个地方使用该属性将会发生)。 我不认为将异常记录和错误处理结合到一个属性或类中是不可能的,而不会变得非常繁琐和复杂,或者影响使用[HandleError] 但是这对我来说是有用的,因为我仅使用[LogErrors]属性来装饰每个控制器一次,并且使用[HandleError]精确地装饰控制器和操作,而不会彼此干扰。 更新: 以下是我如何使用它的示例: [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-4 – 重定向到动作,参数在mvc中始终为空
- 使用ASP.NET的成本
- 休息 – ASP.NET Web API授权和身份验证
- asp.net – 如何防止asp:FormView作为表格呈现?
- asp.net-mvc – 如何使用FluentValidation在ClientSide中验
- asp.net – Web API小写路由
- azure – 错误System.BadImageFormatException服务结构
- asp.net-mvc-2 – 强大类型的ActionLink在Asp.Net MVC 2?
- 从ASP.NET应用程序直接将文件上传到Amazon S3
- asp.net-mvc – ASP.NET MVC;使用EditorTemplates编辑集合,
- 获取Uploadify以使用asp.net-mvc
- asp.net-mvc – 客户端验证未显示消息
- asp.net – 将Eval参数从ASPX文件传递给JavaScri
- asp.net-mvc – 不一致的可访问性:DbContext中的
- 将列表绑定到asp.net 3.5中的列表视图
- 如何衡量我在ASP.NET中的能力水平或技能?
- asp.net-web-api – 从ASP.NET Web API ASP.NET
- asp.net-mvc – 与ASP.NET MVC等效的GetWebResou
- asp.net-mvc – 如何填充/验证您的ViewModels?
- asp.net – 什么叫Page_Load,它是如何做的?
