ASP.NET MVC 6 基于 HTTP 状态代码处理错误

本文关键字:状态 代码 处理 错误 HTTP 基于 NET MVC ASP | 更新日期: 2023-09-27 17:55:35

我想为每个状态代码显示不同的错误消息,例如:

  • 400 错误请求
  • 403 禁止
  • 500 内部服务器错误
  • 404 未找到
  • 401 未经授权

如何在新的 ASP.NET MVC 6 应用程序中实现此目的?我可以使用内置的UseErrorHandler方法执行此操作吗?

application.UseErrorHandler("/error");

另外,我注意到即使使用上述处理程序,输入不存在的URL(例如/this-page-does-exist)也会导致IIS出现丑陋的404 Not Found错误页面。这也可以如何处理?

在MVC 5中,我们不得不使用system.web customerrors部分进行 ASP.NET,使用web.config文件中的system.webServer httpErrors部分,但是很难处理笨拙的,有很多非常奇怪的行为。MVC 6 会让这一切变得简单得多吗?

ASP.NET MVC 6 基于 HTTP 状态代码处理错误

您可以使用StatusCodePagesMiddleware。下面是一个示例:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    app.UseStatusCodePagesWithReExecute("/StatusCodes/StatusCode{0}");
    app.UseMvcWithDefaultRoute();

处理状态代码请求的控制器:

public class StatusCodesController : Controller
{
    public IActionResult StatusCode404()
    {
        return View(viewName: "NotFound"); // you have a view called NotFound.cshtml
    }
    ... more actions here to handle other status codes
}

一些注意事项:

  • 检查其他扩展方法,例如UseStatusCodePagesWithRedirectsUseStatusCodePages其他功能。
  • 我尝试在我的示例中将 StatusCode 作为查询字符串,但看起来像这样中间件不处理查询字符串,但你可以看看此代码并修复此问题。

如何在新的 ASP.NET MVC 6 应用程序中实现此目的?我可以使用内置的UseErrorHandler方法执行此操作吗?

快速回答:不优雅。

解释/替代方案:首先,让我们先看看UseErrorHandler方法实际在做什么: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerExtensions.cs#L25 添加以下中间件: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.cs 注意第 29-78 行(调用方法)

每当有请求进入时,都会执行调用方法(由application.UseErrorHandler("...")Startup.cs中的位置控制)。因此,UseErrorHandler是添加自定义中间件的一种美化方式:中间件=可以对http请求进行操作的组件。

现在有了这个背景,如果我们想添加我们自己的错误中间件来区分请求。我们可以通过修改以下行来添加类似于默认ErrorHandlerMiddleware的类似中间件来做到这一点: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.cs#L48-L51 通过这种方法,我们可以根据状态代码控制重定向路径。

在MVC 5中,我们不得不使用system.web customerrors部分进行 ASP.NET,在web.config文件中使用system.webServer httpErrors部分,但是很难处理笨拙的,有很多非常奇怪的行为。MVC 6 会让这一切变得简单得多吗?

答:确实:)。就像上面的答案一样,修复在于添加中间件。有一个快捷方式可以通过Startup.cs中的IApplicationBuilder添加简单的中间件;在Configure方法的末尾,您可以添加以下内容:

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Could not handle the request.");
    // Nothing else will run after this middleware.
});

这将起作用,因为这意味着您在没有处理请求的情况下到达了 http 管道的末尾(因为它位于 Startup.csConfigure方法的末尾)。如果要添加此中间件(以快速方式)并可以选择在您之后执行中间件,方法如下:

app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("Could not handle the request.");
    // This ensures that any other middelware added after you runs.
    await next();
});

希望这有帮助!