当前位置: 首页 > 知识库问答 >
问题:

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

谢俊力
2023-03-14

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

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

如何在新的ASP。NETMVC6应用程序?我可以使用内置的UseErrorHandler方法执行此操作吗?

application.UseErrorHandler("/error");

另外,我注意到,即使使用上述处理程序,输入不存在的URL(例如/this-page-不存在)也会导致来自IIS的丑陋的404未找到错误页面。这也如何处理?

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

共有2个答案

公西岳
2023-03-14

如何在新的ASP.NETMVC 6应用程序中实现这一点?我可以使用内置的UseErrorHandler方法做到这一点吗?

快速回答:不是以优雅的方式。

解释/替代:首先,让我们看看<code>UseErrorHandler</code>方法实际上在做什么: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行(调用方法)

每当有请求传入时,就会执行 invoke 方法(由应用程序的位置控制)。在你的初创公司中使用错误处理程序(“...”).cs)。因此,UseErrorHandler是一种添加自定义中间件的美化方式:中间件=可以对http请求起作用的组件。

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

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

答案:它肯定是:)。就像上面的答案一样,修复方法在于添加中间件。通过Startup.cs中的IApplication ationBuilder添加简单中间件有一个快捷方式;在配置方法的末尾,您可以添加以下内容:

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Could not handle the request.");

    // Nothing else will run after this middleware.
});

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

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();
});

希望这有帮助!

西门凯康
2023-03-14

您可以为此使用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
}

一些注意事项:

    < li >检查其他扩展方法,如< code > usestatusdepageswithredirects 和< code > usestatusdepages 以了解其他功能。 < li >在我的示例中,我尝试将StatusCode作为查询字符串,但看起来该中间件不处理查询字符串,但您可以查看此代码并修复此问题。
 类似资料:
  • 我使用Spring中的webClient从GraphQL WebService中获取数据。此代码位于一个泛型方法中,该方法将响应体解码为不同类型的对象。如果响应是预期的类型,则它运行良好。 现在我想处理来自WebService的错误。因此,我的问题与此非常相似:Spring Webflux:Webclient:Get body on error我发现建议使用onStatus,但我的问题是,即使re

  • 如何在SpringMVC中实现自定义http错误处理。 例如:我有一个urlhttp://localhost:8080/demo/canvas 它显示我的画布页面,但如果用户错过了网址并键入http://localhost:8080/demo/canva 它显示了Tomcat呈现的HTTP状态404。我希望它是自定义jsp页面。

  • 我知道有人正在编写一个API,并希望使用HTTP状态代码来报告查询的结果。例如,如果用户调用,并且产品不存在,它将返回HTTP状态。我认为,因为这是一个有效的调用(即实际的HTTP请求没有格式错误),它应该返回一个code响应,并且只需要响应的主体类似于。 所以我的问题是,, 1) 使用HTTP状态码来传递非HTTP程序状态是否合适,如上面的示例所示? 2)是否有一些标准规范,或者至少是广泛使用的

  • 问题内容: 我现在将脚本更改为jquery。这是我的旧javascript: 我现在想将其更改为jquery-ajax: 像在旧脚本中一样,如何测试请求返回的状态码(和responseText)? 问题答案: 试试这个: 要么:

  • 我考虑在项目中使用fluent-http。 所以我尝试注入: 返回正确的字符串,但似乎没有使用状态代码。在这两种情况下,响应都有一个代码HTTP200。 注意:我发现一些状态代码是预先实现的: null

  • 主要内容:1 1xx:信息,2 2xx:成功,3 3xx:重定向,4 4xx:客户端错误,5 5xx:服务器错误当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。 HTTP状态码的英文为HTTP Status Code。下面是常见的HTTP状态码:  1xx - 这意味着已收到请求,并且该过程正在继续。 2xx - 这意味着已成功接收,理解并接受了该