使用UseStatusCodePagesWithReExecute时,不会将状态码发送到浏览器

时间:2017-09-22 21:48:47

标签: asp.net-core

我有一个简单的.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文件用作错误页面吗?

1 个答案:

答案 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}将自动替换为状态码整数。