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 会让这一切变得简单得多吗?
您可以使用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
}
一些注意事项:
- 检查其他扩展方法,例如
UseStatusCodePagesWithRedirects
并UseStatusCodePages
其他功能。 - 我尝试在我的示例中将 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.cs
中Configure
方法的末尾)。如果要添加此中间件(以快速方式)并可以选择在您之后执行中间件,方法如下:
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();
});
希望这有帮助!