问题描述:
我正在尝试创建属性,定义如何在我的 ASP.NET MVC 4 控制器和操作中处理异常。具体来说,他们将设置结果返回到服务器。我几乎达到了预期的效果,但是调用命令有问题。这是我目前正在做的一个例子:
[DefaultExceptionHandler]
public abstract class BaseController
{
}
public abstract class AuthorizeController : BaseController
[VeryGoodExceptionHandler]
public class VeryGoodController : AuthorizeController
{
[ViewPageExceptionHandler]
public ActionResult ViewPage()
{
throw new Exception(); //Just for demonstration
return View();
}
public ActionResult ActionWithoutAttribute()
{
return View();
}
}
这是我的控制器的基本结构。这些属性都是以下类的后代:
public abstract class ExceptionHandlerAttributeBase : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.Result = CreateExceptionResult(filterContext.Exception);
}
protected abstract ActionResult CreateExceptionResult(Exception e);
}
CreateExceptionResult 可以返回一个 JsonResult、一个 View、一个 StatusCodeResult,无论你想要什么。在我的情况下,它总是接收一个特殊的异常类型(一些企业库魔法),但这不是必需的。
该属性工作得非常好,我把它放在一些东西上,OnException 方法被调用,就像它应该的那样,将正确的 ActionResult 放在 filterContext 中,并将它发送回客户端。当我想覆盖该属性时,问题就开始了。碰巧的是,每个 OnException 方法都被调用,具有相同的上下文。当只有控制器被装饰时,一切(几乎)都很好,首先,放置在 BaseController 上的那个被调用,然后是“VeryGoodController”上的那个,覆盖了结果。摆脱碱基调用会很好,但无论如何。在 Action 和修饰的控制器的情况下,调用顺序恰好是:动作属性的 OnException(设置所需的结果)、基控制器的 OnException 和子控制器的 s OnException(覆盖期望的结果)。ExceptionContext 没有任何属性可用作进一步处理的标志(也许 Exception 属性可以设置为 null,但我不会这样做)。
问题: 所以问题是我怎样才能得到 a) 最后调用 Action 的 OnException 方法,和/或如果可能 b) 拒绝调用不太具体的方法(以更有效的方式,然后只需他们的结果被覆盖)?
一些额外信息: 我已将此答案用作参考。另外,如果我按照本文中描述的方式注册过滤器,并且不添加属性,也会发生同样的情况。
在此先感谢,罗伯特