找不到MVC 6 404

时间:2015-04-02 19:43:00

标签: asp.net-mvc asp.net-core asp.net-core-mvc

我希望有一个通用的404 Not Found页面(HTTP 200),而不是获得HTTP 404响应。我知道你可以使用

在MVC 5中设置它
<customErrors mode="On">
  <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>

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

6 个答案:

答案 0 :(得分: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}");
    }
} 

project.json:

"dependencies": {
    "Microsoft.AspNet.Diagnostics": "1.0.0-*",
    // ....
}

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

答案 1 :(得分:4)

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

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

如果管道中没有任何东西可以处理它(这就是你想要的),这会将状态代码设置为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);
    }
}

答案 2 :(得分:3)

如果有人想要使用HTML创建自定义404页面,您可以这样做:

<强> Startup.cs

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {        
        app.UseStatusCodePagesWithReExecute("/errors/{0}");
    }
}

<强> project.json

"dependencies": {
    "Microsoft.AspNet.Diagnostics": "1.0.0-*",
    // ....
}

<强> ErrorsController.cs

public class ErrorsController : Controller
{
    // ....

    [Route("/Error/{statusCode}")]
    public IActionResult ErrorRoute(string statusCode)
    {
        if (statusCode == "500" | statusCode == "404")
        {
            return View(statusCode);
        }

        return View("~/Views/Errors/Default.cshtml");
    }
}

此后剩下的就是在Errors视图文件夹中创建404.cshtml,500.cshtml和Default.cshtml,并根据自己的喜好自定义HTML。

答案 3 :(得分:1)

在Startup类的Configure函数中,调用:

app.UseErrorPage(ErrorPageOptions.ShowAll);

准备更多生产:

    if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
    {
        app.UseBrowserLink();
        app.UseErrorPage(ErrorPageOptions.ShowAll);
        app.UseDatabaseErrorPage(DatabaseErrorPageOptions.ShowAll);
    }
    else
    {
        // Add Error handling middleware which catches all application specific errors and
        // send the request to the following path or controller action.
        app.UseErrorHandler("/Home/Error");
    }

答案 4 :(得分:0)

有一个名为StatusCodePagesMiddleware的中间件我认为是在Beta3之后添加的。

示例:https://github.com/aspnet/Diagnostics/blob/dev/samples/StatusCodePagesSample/Startup.cs

答案 5 :(得分:0)

如果您有一个标准的ASP.NET 5 Web应用程序模板项目,您可以获得一个非常好的解决方案,它将同时处理保存错误状态代码,同时提供您选择的cshtml文件。

Startup.csConfigure方法

替换

app.UseExceptionHandler("/Error");

app.UseStatusCodePagesWithReExecute("/Home/Errors/{0}");

然后删除以下catchall:

app.Run(async (context) => 
{ 
   var logger = loggerFactory.CreateLogger("Catchall Endpoint"); 
   logger.LogInformation("No endpoint found for request {path}", context.Request.Path); 
   await context.Response.WriteAsync("No endpoint found - try /api/todo."); 
});

HomeController.cs

将当前Error方法替换为以下方法:

public IActionResult Errors(string id) 
{ 
  if (id == "500" | id == "404") 
  { 
    return View($"~/Views/Home/Error/{id}.cshtml"); 
  }

  return View("~/Views/Shared/Error.cshtml"); 
}

通过这种方式,您可以添加您认为用户可以从中受益的错误文件(而搜索引擎仍然可以获得正确的状态代码)

现在在Error文件夹中添加名为~Views/Home的文件夹 创建两个.cshtml个文件。将第一个命名为404.cshtml,将第二个命名为500.cshtml

为他们提供一些有用的内容并启动应用程序并编写类似http://localhost:44306/idonthaveanendpointhere的内容并确认设置有效。

同时按F12开发人员工具并确认状态代码为404。