【问题标题】:Is it possible to have ActionFilter exceptions handled via the [HandleError] mechanism?是否可以通过 [HandleError] 机制处理 ActionFilter 异常?
【发布时间】:2011-09-12 14:27:59
【问题描述】:

我的 ASP.NET MVC 3 应用程序中有一个自定义操作过滤器 (AuthenticateAttribute),可确保用户登录。

我想在 OnActionExecuting 方法中引发异常,并希望这些异常由 HandleError 全局过滤器处理。这可能吗?如果可以,我该怎么做?

目前,在 OnActionExecuting 中引发异常会绕过 HandleError 全局过滤器 - 大概是因为它只会捕获操作本身中发生的异常。

【问题讨论】:

    标签: asp.net-mvc-3 exception action-filter handleerror


    【解决方案1】:

    OnActionExecuting 中抛出的异常将由全局 HandleErrorAttribute 处理。您只需要确保在您的 web.config 中启用了它:

    <customErrors mode="On" />
    

    据说您谈到了AuthenticateAttributeOnActionExecuting 事件。这两个概念是不相容的。如果您正在编写自定义授权属性,您可能应该从AuthorizeAttribute 派生并覆盖用于身份验证的AuthorizeCore 方法和用于处理未经授权情况的HandleUnauthorizedRequest 方法。

    如果您不想使用全局 HandleErrorAttribute 来执行以下操作而不是抛出异常,您也有可能:

    filterContext.Result = new ViewResult
    {
        ViewName = "~/Views/Shared/401.cshtml"
    };
    

    在动作属性中设置结果将短路控制器动作的执行并直接渲染视图。

    【讨论】:

    • 嗯... HandleErrors 机制似乎只适用于某些类型的异常。我抛出了 UnauthorizedAccessException,它没有被捕获。但是异常按预期处理。
    • 是的,控制器逻辑中的自定义未处理 UnauthorizedExceptions 将不会由 asp.net 管道处理(并直接指向 CustomErrors)。考虑创建一个实现 IExceptionFilter 的 ExceptionAttribute,然后在 GlobalFilters 中注册它。在此范围内,您可以将自定义异常作为 HttpException(401) 重新抛出,并将自定义异常作为内部异常。这将使 asp.net 管道拾取它并使用 CustomErrors 中定义的页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多