与 ASP.net 5 MVC 6 中的错误处理混淆
Confused with error handling in ASP.net 5 MVC 6
我想要 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。
此外,当出现 400
、403
或任何其他情况时会发生什么情况?他们会被抓住吗?如果是这样,他们会在什么时候被抓到?
如您所知,我很困惑,希望有人能为我提供一个处理所有不同状态代码的示例。
听起来您混淆了未处理的异常(默认情况下,return作为 HTTP 500 内部服务器错误发送给客户端)和代表无效操作导致的正确处理的错误案例user/client 的(其中 4xx HTTP 代码被 return 发送给用户)。
只有前者与 UseExceptionHandler 调用有关 - 默认情况下,它会捕获任何未处理的异常并将它们路由到您提供的任何内容(在您的情况下,一个视图,但它可以很容易地成为一个检查未处理的异常以将某些错误情况转换为 HTTP 4xx return 代码的一段代码 - 例如,将身份验证错误转换为 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}");
}
我想要 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。
此外,当出现 400
、403
或任何其他情况时会发生什么情况?他们会被抓住吗?如果是这样,他们会在什么时候被抓到?
如您所知,我很困惑,希望有人能为我提供一个处理所有不同状态代码的示例。
听起来您混淆了未处理的异常(默认情况下,return作为 HTTP 500 内部服务器错误发送给客户端)和代表无效操作导致的正确处理的错误案例user/client 的(其中 4xx HTTP 代码被 return 发送给用户)。
只有前者与 UseExceptionHandler 调用有关 - 默认情况下,它会捕获任何未处理的异常并将它们路由到您提供的任何内容(在您的情况下,一个视图,但它可以很容易地成为一个检查未处理的异常以将某些错误情况转换为 HTTP 4xx return 代码的一段代码 - 例如,将身份验证错误转换为 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}");
}