我有一个简单的.NET Core 2.0项目。这是Configure方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment environment)
{
app.UseStatusCodePagesWithReExecute("/error/{0}.html");
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action?}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
}
当我输入无效网址时,会按预期显示/error/404.html,但浏览器会获得200状态代码,而不是预期的404状态。
我做错了什么?我可以不将静态html文件用作错误页面吗?
答案 0 :(得分:3)
当您使用app.UseStatusCodePagesWithReExecute
时
添加一个StatusCodePages中间件,指定应通过使用alternate重新执行请求管道来生成响应主体 路径。
由于路径/error/404.html
存在且工作正常,因此使用了200状态。
您可以使用以下方法(查看this article以获取更详细的说明):
设置操作,将根据状态代码返回View,作为查询参数传递
public class ErrorController : Controller
{
[HttpGet("/error")]
public IActionResult Error(int? statusCode = null)
{
if (statusCode.HasValue)
{
// here is the trick
this.HttpContext.Response.StatusCode = statusCode.Value;
}
//return a static file.
return File("~/error/${statusCode}.html", "text/html");
// or return View
// return View(<view name based on statusCode>);
}
}
然后将中间件注册为
app.UseStatusCodePagesWithReExecute("/Error", "?statusCode={0}");
在重定向期间,此占位符{0}将自动替换为状态码整数。