Docs:处理 ASP.NET Core 中的错误

两种 404 错误:

  1. 通过 Id 找不到指定的内容或信息
  2. 请求的 URL 地址和路由不匹配

    处理 Id 错误

    处理 Id 错误需设置 StatusCode 并返回对应的错误页。

    1. public IActionResult Details(int id)
    2. {
    3. var student = _studentRepository.GetStudent(id);
    4. if (student == null)
    5. {
    6. Response.StatusCode = 404;
    7. return View("StudentNotFound", id);
    8. }
    9. var homeDetailsViewModel = new HomeDetailsViewModel
    10. {
    11. Student = student,
    12. PageTitle = "学生详细信息"
    13. };
    14. return View(homeDetailsViewModel);
    15. }

错误页:

  1. @model int
  2. @{
  3. ViewBag.Title = "404 找不到内容";
  4. }
  5. <div class="alert alert-danger mt-1 mb-1">
  6. <h4>404 Not Found 错误</h4>
  7. <hr />
  8. <h6>查询不到 ID 为 @Model 的学生信息</h6>
  9. </div>
  10. <a asp-controller="Home" asp-action="Index" class="btn btn-outline-success" style="width: auto">
  11. 返回学生列表
  12. </a>

统一处理

三种统一处理的方式:

  • UseStatusCodePages
  • UseStatusCodePagesWithRedirects
  • UseStatusCodePagesWithReExecute

在 Startup 里面启用 UseStatusCodePagesWithRedirects:

  1. if (env.IsDevelopment())
  2. {
  3. app.UseDeveloperExceptionPage();
  4. }
  5. else
  6. {
  7. app.UseStatusCodePagesWithRedirects("/Error/{0}");
  8. }

ErrorController:

  1. public class ErrorController : Controller
  2. {
  3. [Route("Error/{statusCode}")]
  4. public IActionResult HttpStatusCodeHandler(int statusCode)
  5. {
  6. switch (statusCode)
  7. {
  8. case 404:
  9. ViewBag.ErrorMessage = "抱歉,您访问的页面不存在";
  10. break;
  11. }
  12. return View("NotFound");
  13. }
  14. }

NotFound 展示错误信息,并提供链接返回首页:

  1. @{
  2. ViewBag.Title = "页面不存在";
  3. }
  4. <h1>@ViewBag.ErrorMessage</h1>
  5. <a asp-controller="Home" asp-action="Index">点击此处返回首页</a>

UseStatusCodePagesWithRedirects vs UseStatusCodePagesWithReExecute

Redirects:

  • 会发出重定向请求,而地址栏中的 URL 将发生更改
  • 当发生真实错误时,它返回一个 success status(200),它在语义上是不正确的

ReExecute:

  • 重新执行管道请求并返回原始状态码(如 404)
  • 由于它是重新执行管道请求,而不是发出重定向请求,所以我们地址栏中会保留原始 URL

地址栏保留原始 URL:
image.png