.NET 5.0 生产中的自定义错误页面

Custom Error Page in Production for .NET 5.0

我正在尝试在我的 .NET 5.0 中实现自定义 404 页面,以便在 Web 应用程序投入生产时使用。我在 Startup.cs;

中实现了以下内容
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            } 
            else
            {
                app.UseStatusCodePagesWithRedirects("/Error/{0}");
            } 
            ...
}

链接到一个简单的 ErrorController

public class ErrorController : Controller
    {
        [Route("/Error/{statusCode}")]
        public IActionResult HttpStatusCodeHandler(int statusCode)
        {
            switch(statusCode)
            {
                case 404:
                    //ViewBag.ErrorMessage("Resource could not be found.");
                    break;
            }
            return View("Error");
        }
    }

然后转到 Error.cshtml,在 Shared.

中找到

这不会删除默认的 Status Code: 404; Not Found 页面,但如果我通过 url.

直接转到 localhost/Error/404,则可以访问该页面

我记得在以前的 .NET 版本中是这样实现的,但现在我不确定我是否遗漏了什么,或者新的 .NET 5.0 是否有实现自定义 404 页面的新要求。

如有任何帮助,我们将不胜感激。

编辑:launchSettings.json个人资料:

"Proj_prod": {
            "commandName": "Project",
            "dotnetRunMessages": "true",
            "launchBrowser": true,
            "applicationUrl": "https://localhost:5001;http://localhost:5000",
            "environmentVariables": {
                "ASPNETCORE_ENVIRONMENT": "Production"
            }
        }

首先检查您的路由是否正确,或者您是否被重定向到 /Error/404 然后您可以将用户重定向到自定义 404

 [Route("/Error/{statusCode}")]
    public IActionResult HttpStatusCodeHandler(int? statusCode)
    {
        switch(statusCode.Value)
        {
            case 404:
                //ViewBag.ErrorMessage("Resource could not be found.");
                //TempData["Message"] = "Resource could not be found."
                return RedirectToAction("404");
                break;
        }
        return View("Error");
    }

PS:你也可以使用app.UseStatusCodePagesWithReExecute("/Home/Error", "?statusCode={0}");来发送请求参数,而不是路由

我了解你 运行 你的项目 IIS Express。为此,您无法按预期找到您的自定义错误页面。您应该在 launchsettings.json 中的 profile 中使用 "ASPNETCORE_ENVIRONMENT": "Production",它可以解决您的问题。只需像下面这样更改您的代码。


//clarify

  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"   //add this
      }
    },
    "Proj_prod": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

好的,有问题的实际代码按预期工作。工作伙伴 app.UseStatusCodePages(); 很晚才在我没有注意到的 Configure 下添加。

(是的,花了 14 天。我终于回到了这里,才注意到。)