【问题标题】:Confused with error handling in ASP.net 5 MVC 6对 ASP.net 5 MVC 6 中的错误处理感到困惑
【发布时间】:2016-01-27 07:34:07
【问题描述】:

我希望有 1 个错误页面,根据提供的查询字符串向用户显示略有不同的错误消息。

在创建新的 asp.net 5 项目时,我注意到 Startup.cs 文件中有以下代码。

if (env.IsDevelopment())
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}

当异常发生时,我已经能够让它显示正确的错误页面。我的问题是它似乎只捕捉到我的应用程序中没有处理的错误,即总是状态码为500。这个对吗?

为了处理404 错误,我使用以下代码:

app.UseStatusCodePagesWithReExecute("/Error/{0}"); 

我的控制器实现为:

[HttpGet("{statusCode}")]
public IActionResult Error(int statusCode)
{
    return View(statusCode);
}

这似乎捕获了404 错误并显示正确的状态代码。

如果我在上面的 if 语句中更新我的代码以使用相同的操作,例如:

if (env.IsDevelopment())
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error/{0}");
}

返回的状态码始终为0。

此外,当400403 或任何其他情况发生时会发生什么?他们会被抓住吗?如果是这样,他们会在什么时候被抓住?

如您所知,我很困惑,希望有人能提供一个处理所有不同状态代码的示例。

【问题讨论】:

  • 不会在 global.asax 帮助中的 Application_Error 事件中全局捕获错误? stackoverflow.com/questions/16884074/…
  • 看起来像 asp.net MVC5?
  • 可以发一下UseExceptionHandler的代码吗?
  • ???这是内置在 asp 中的吗?
  • 您是否愿意设计一些新的通用机制来处理这个问题,或者您只想让事情适合现有的代码?

标签: c# exception asp.net-core asp.net-core-mvc http-status-codes


【解决方案1】:

听起来您混淆了未处理的异常(默认情况下,这些异常作为 HTTP 500 内部服务器错误返回给客户端)和由代表用户/客户端的无效操作引起的正确处理的错误情况(其中一个 4xx HTTP 代码返回给用户)。

只有前者与 UseExceptionHandler 调用有关 - 默认情况下,它会捕获任何未处理的异常并将它们路由到您提供的任何内容(在您的情况下,一个视图,但它可以很容易地成为一个检查未处理异常以将某些错误情况转换为 HTTP 4xx 返回代码的代码 - 例如,将身份验证错误转换为 HTTP 401 响应)。

UseStatusCodePagesWithReExecute 将在已生成状态代码 400-599 的位置介入,只要尚未生成响应正文。 source code in question 显示了这是如何确定的。

在您的第二个代码块中,您使用了 UseExceptionHandler - 我认为您应该具有以下内容:

if (env.IsDevelopment())
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage();
}
else
{
    // Handle unhandled errors
    app.UseExceptionHandler("/Home/Error");
    // Display friendly error pages for any non-success case
    // This will handle any situation where a status code is >= 400
    // and < 600, so long as no response body has already been
    // generated.
    app.UseStatusCodePagesWithReExecute("/Error/{0}"); 
}

【讨论】:

  • 好吧,你说的大部分都是有道理的。我唯一的疑问是这行代码会有什么样的错误代码:app.UseStatusCodePagesWithReExecute("/Error/{0}");捕获 404 以外的内容?
  • 这是the definitive answer 在那个上 - 任何状态代码为 400 到 600(包括 400 到 600)的内容,其中尚未生成响应正文,都将由 UseStatusCodePages 处理。我会更新答案以反映这一点。
  • 一个精确的答案thnx @MarkHughes
  • @MarkHughes 修复了“最终答案”的链接github.com/aspnet/Diagnostics/blob/master/src/…
猜你喜欢
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2013-11-21
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多