我希望有一个通用的404 Not Found页面(HTTP 200),而不是获得HTTP 404响应。我知道你可以使用
在MVC 5中设置它<customErrors mode="On">
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
但我似乎无法弄清楚如何在MVC 6中执行此操作。我猜它应该在UseMvc路由表或自定义中间件中。
答案 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.cs
,Configure
方法
替换
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。