显示ASP.NET Core MVC的404找不到页面

Muh*_*eed 8 c# asp.net iis asp.net-core-mvc asp.net-core

我正在使用下面的中间件来为HTTP状态代码400到599设置错误页面。因此访问将/error/400显示400 Bad Request错误页面。

application.UseStatusCodePagesWithReExecute("/error/{0}");

[Route("[controller]")]
public class ErrorController : Controller
{
    [HttpGet("{statusCode}")]
    public IActionResult Error(int statusCode)
    {
        this.Response.StatusCode = statusCode;
        return this.View(statusCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,访问会/this-page-does-not-exist导致出现“未找到IIS 404”的一般错误页面。

有没有办法处理不匹配任何路由的请求?在IIS接管之前,如何处理此类请求?理想情况下,我想将请求转发给/error/404我,以便我的错误控制器可以处理它。

在ASP.NET 4.6 MVC 5中,我们必须使用Web.config文件中的httpErrors部分来执行此操作。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error statusCode="404" responseMode="ExecuteURL" path="/error/404/" />
    </httpErrors>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

Mah*_*ahi 18

我发现的最好的教程之一是:https : //joonasw.net/view/custom-error-pages

总结在这里:

1.首先添加一个控制器,ErrorController然后添加这个动作:

[Route("404")]
public IActionResult PageNotFound()
{
    string originalPath = "unknown";
    if (HttpContext.Items.ContainsKey("originalPath"))
    {
        originalPath = HttpContext.Items["originalPath"] as string;
    }
    return View();
}
Run Code Online (Sandbox Code Playgroud)

注意:您可以将操作添加到另一个现有控制器,如HomeController.

2. 现在添加PageNotFound.cshtml视图。像这样的东西:

@{
    ViewBag.Title = "404";
}

<h1>404 - Page not found</h1>

<p>Oops, better check that URL.</p>
Run Code Online (Sandbox Code Playgroud)

3. 重要的部分在这里。将此代码添加到Startup类的内部Configure方法中:

@{
    ViewBag.Title = "404";
}

<h1>404 - Page not found</h1>

<p>Oops, better check that URL.</p>
Run Code Online (Sandbox Code Playgroud)

请注意,它必须在路由配置之前添加,例如app.UseEndpoints....

  • 非常重要的注意:必须在 app.UseEndpoints 等路由配置之前添加 (4认同)
  • 这个答案中缺少的另一件重要的事情是,在错误控制器中添加“[Route(“error”)]” (2认同)

Sho*_*din 6

您可以在 asp.net core 中的 EndPoint 中使用回退如下(在 app.UseEndpoints 内)和剃刀页面(NotFound 是页面文件夹中的剃刀页面而不是控制器)

 endpoints.MapRazorPages();
            
 endpoints.MapFallback( context => {
    context.Response.Redirect("/NotFound");
    return Task.CompletedTask;
  });
Run Code Online (Sandbox Code Playgroud)

  • “/NotFound”不是“Not Found”,而是作为资源存在。如果原始请求 URI 中指示的资源不存在,则直接响应应包含 404 状态和未找到内容,而不是重定向。 (2认同)

Fra*_*rdo 5

基于此SO项,IIS在到达404之前先获取404(并对其进行处理)UseStatusCodePagesWithReExecute

您是否尝试过:https : //github.com/aspnet/Diagnostics/issues/144?它建议终止接收到404的请求,以使它不会转到IIS进行处理。这是添加到启动中的代码:

app.Run(context =>
{
   context.Response.StatusCode = 404;
   return Task.FromResult(0);
});
Run Code Online (Sandbox Code Playgroud)

这似乎是一个仅限IIS的问题。