1

首先让我描述一下我的错误处理是如何设置的,因为在 ASP.NET MVC 中有几种方法可以做到这一点。我已经在 web.config 中配置了 httpErrors,在控制器库中覆盖了 HandleUnknownAction 并设置了一个路由来处理任何未定义的东西,这工作正常(例如,当没有找到任何东西时显示我的 404 错误页面,并在出现问题时显示我的 500 错误页面代码错误)。

网络配置:

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <error statusCode="400" path="/error/400" responseMode="ExecuteURL" />
      <error statusCode="401" path="/error/401" responseMode="ExecuteURL" />
      <error statusCode="402" path="/error/402" responseMode="ExecuteURL" />
      <error statusCode="403" path="/error/403" responseMode="ExecuteURL" />
      <error statusCode="404" path="/error/404" responseMode="ExecuteURL" />
      <error statusCode="405" path="/error/405" responseMode="ExecuteURL" />
      <error statusCode="406" path="/error/406" responseMode="ExecuteURL" />
      <error statusCode="407" path="/error/407" responseMode="ExecuteURL" />
      <error statusCode="408" path="/error/408" responseMode="ExecuteURL" />
      <error statusCode="409" path="/error/409" responseMode="ExecuteURL" />
      <error statusCode="410" path="/error/410" responseMode="ExecuteURL" />
      <error statusCode="411" path="/error/411" responseMode="ExecuteURL" />
      <error statusCode="412" path="/error/412" responseMode="ExecuteURL" />
      <error statusCode="413" path="/error/413" responseMode="ExecuteURL" />
      <error statusCode="414" path="/error/414" responseMode="ExecuteURL" />
      <error statusCode="415" path="/error/415" responseMode="ExecuteURL" />
      <error statusCode="416" path="/error/416" responseMode="ExecuteURL" />
      <error statusCode="417" path="/error/417" responseMode="ExecuteURL" />
      <error statusCode="429" path="/error/429" responseMode="ExecuteURL" />
      <error statusCode="500" path="/error/500" responseMode="ExecuteURL" />
      <error statusCode="501" path="/error/501" responseMode="ExecuteURL" />
      <error statusCode="502" path="/error/502" responseMode="ExecuteURL" />
      <error statusCode="503" path="/error/503" responseMode="ExecuteURL" />
      <error statusCode="504" path="/error/504" responseMode="ExecuteURL" />
      <error statusCode="505" path="/error/505" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

(我的自定义错误页面是一个带有“error/{code}”路由的视图)

控制器底座:

protected override void HandleUnknownAction(string actionName)
{
    throw new HttpException(404, null);
}

路由配置:

routes.MapRoute("Undefined", "{*url}", new { controller = "Undefined", action = "Index" });

未定义控制器:

public class UndefinedController : Controller
{
    public ActionResult Index()
    {
        throw new HttpException(404, null);
    }
}

我还有一个 HttpErrorResult (ActionResult) 类,它可以很好地返回任何错误:

public class HttpErrorResult : ActionResult
{
    private int _code = 0;

    public HttpErrorResult(int code)
    {
        _code = code;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        throw new HttpException(_code, null);
    }
}

好的,这应该是我的错误处理中涉及的所有代码。

我遇到的问题是,当我从属性返回 HttpErrorResult 时,它不会显示我的自定义错误页面,而是显示标准的黄色错误页面,上面写着“'/' 应用程序中的服务器错误”“'System.Web.HttpException 类型的异常” ’被抛出。”

具体来说,当我尝试在 EnforceRequestLimitAttribute (AuthorizeAttribute) 类中返回 429 错误(请求太多)时,我遇到了这个问题:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    if (!AuthorizeCore(filterContext.HttpContext))
        filterContext.Result = new HttpErrorResult(429);
    else
        base.OnAuthorization(filterContext);
}

我无法理解其原因,因为在 HandleUnknownAction 方法和 UndefinedController 中抛出 HttpException 并在任何其他控制器中使用 HttpErrorResult 来获取自定义错误页面,但在 Attribute 中它的行为不同,它工作得很好。

为什么会这样,可以做些什么来解决它?

4

2 回答 2

0

我还没有弄清楚为什么只是简单地设置 Response.StatusCode 而不是返回抛出 HttpException 的 Result 具有预期的效果,即显示自定义错误页面。

filterContext.HttpContext.Response.StatusCode = 429;
于 2014-05-14T00:21:48.133 回答
0

对我来说,问题出在 Global.asax.cs 中。当我在调试模式下遇到异常时,我按 F10 跳过它,看看还有什么情况。原来我在做一个

Server.ClearError();

这阻止了自定义错误页面的显示。删除此行解决了该问题。

于 2018-06-25T10:47:45.077 回答