找不到MVC 6 404

Mic*_*ael 9 asp.net-mvc asp.net-core-mvc asp.net-core

我想要一个通用的404 Not Found页面(HTTP 200),而不是获得HTTP 404响应.我知道你可以在MVC 5中设置它

<customErrors mode="On">
  <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

但我似乎无法弄清楚如何在MVC 6中执行此操作.我猜它应该在UseMvc路由表或自定义中间件中.

Bar*_*xto 13

Startup.cs:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        // PICK YOUR FLAVOR.

        // app.UseErrorPage(ErrorPageOptions.ShowAll);
        app.UseStatusCodePages(); // There is a default response but any of the following can be used to change the behavior.

        // app.UseStatusCodePages(context => context.HttpContext.Response.SendAsync("Handler, status code: " + context.HttpContext.Response.StatusCode, "text/plain"));
        // app.UseStatusCodePages("text/plain", "Response, status code: {0}");
        // app.UseStatusCodePagesWithRedirects("~/errors/{0}"); // PathBase relative
        // app.UseStatusCodePagesWithRedirects("/base/errors/{0}"); // Absolute
        // app.UseStatusCodePages(builder => builder.UseWelcomePage());
        // app.UseStatusCodePagesWithReExecute("/errors/{0}");
    }
} 
Run Code Online (Sandbox Code Playgroud)

project.json:

"dependencies": {
    "Microsoft.AspNet.Diagnostics": "1.0.0-*",
    // ....
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在IIS(或azure)上托管,web.config它仍然有效,并且在某些托管方案中可能需要它.(它应放在wwwroot文件夹中


小智 5

您可以使用 来处理 404 错误,UseStatusCodePagesWithReExecute 但您需要首先在配置管道末尾设置状态代码。

public void Configure(IApplicationBuilder app)
    {
        app.UseIISPlatformHandler();

        if (string.Equals(_env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
        {
            app.UseDeveloperExceptionPage();
            app.UseRuntimeInfoPage();
        } else
        {
            app.UseExceptionHandler("/Error");
        }
        app.UseStatusCodePagesWithReExecute("/Error/Status/{0}");

        app.UseStaticFiles();

        app.UseMvc();

        app.Use((context, next) =>
        {
            context.Response.StatusCode = 404;
            return next();
        });
    }
Run Code Online (Sandbox Code Playgroud)

如果管道中没有任何内容可以处理它(这正是您想要的),这会将状态代码设置为 404。

然后,您可以在控制器中以任何您想要的方式轻松捕获和处理响应。

[Route("error")]
public class ErrorController : Controller
{

[Route("Status/{statusCode}")]
    public IActionResult StatusCode(int statusCode)
    {

            //logic to generate status code response

            return View("Status", model);
    }
}
Run Code Online (Sandbox Code Playgroud)