我正在使用UseStatusCodePages中间件在我的应用程序上显示状态代码页,但它在UI上显示纯文本而没有任何其他信息,
我希望显示带有状态代码信息的用户界面以及其他一些有用的信息,例如客户支持号码以及更加用户友好的页面。
我发现我们可以使用两种扩展方法来实现UseStatusCodePagesWithRedirects和UseStatusCodePagesWithReExecute。我发现Microsoft Docs只有差异,
UseStatusCodePagesWithRedirects :将302发送给客户。
UseStatusCodePagesWithReExecute :发送原始状态代码并执行重定向网址处理程序。
这是唯一的区别吗?
答案 0 :(得分:1)
从最终用户的角度来看,无论使用哪种中间件组件,行为都没有区别。在这两种情况下,我们都会看到指定的自定义错误视图。
UseStatusCodePagesWithRedirects
使用UseStatusCodePagesWithRedirects请求处理
使用UseStatusCodePagesWithReExecute请求处理
如果您使用UseStatusCodePagesWithReExecute
中间件,也可以使用ErrorController
界面在IStatusCodeReExecuteFeature
中获取原始路径,如下所示。
public class ErrorController : Controller
{
[Route("Error/{statusCode}")]
public IActionResult HttpStatusCodeHandler(int statusCode)
{
var statusCodeResult =
HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
switch (statusCode)
{
case 404:
ViewBag.ErrorMessage =
"Sorry, the resource you requested could not be found";
ViewBag.Path = statusCodeResult.OriginalPath;
ViewBag.QS = statusCodeResult.OriginalQueryString;
break;
}
return View("NotFound");
}
}
然后您可以在自定义错误视图中显示它,如下所示
@{
ViewBag.Title = "Not Found";
}
<h1>@ViewBag.ErrorMessage</h1>
<h1>@ViewBag.Path</h1>
<h1>@ViewBag.QS</h1>
<a asp-action="index" asp-controller="home">
Click here to navigate to the home page
</a>
答案 1 :(得分:1)
使用app.UseStatusCodePagesWithRedirects(“ / Error / {0}”)和无效请求(例如说“ / abc / xyz”)时会引发;
但是在使用app.UseStatusCodePagesWithReExecute(“ / Error / {0}”)和无效请求(例如说“ / abc / xyz”)时出现了
app.UseStatusCodePagesWithReExecute(“ / Error / {0}”)中间件拦截404状态代码并重新执行将其指向URL的管道
当中间件重新执行管道时,地址栏中的原始URL“ / abc / xyz”被保留。它不会从“ / abc / xyz”更改为“ / Error / {0}”。
原始状态代码(在这种情况下为404)保留在开发人员工具中。
答案 2 :(得分:0)
我认为主要区别在于UseStatusCodePagesWithRedirects将您重定向到错误控制器操作方法,而UseStatusCodePagesWithReExecute只是呈现页面而没有重定向
示例
控制器动作
[Route("error/404")]
public IActionResult Error404(int code)
{
return View("Error404");
}
[Route("error/{code}")]
public IActionResult Error(int code)
{
return StatusCode(code);
}
启动Cinfigue
app.UseStatusCodePagesWithRedirects("/error/{0}");
或
app.UseStatusCodePagesWithReExecute("/error/{0}");
案例1(404错误)
网址:https://localhost:5001/notexits_page
1) UseStatusCodePagesWithRedirects
结果:
网址为:https://localhost:5001/error/404
我们看到Error404页面
2) UseStatusCodePagesWithReExecute
结果:
网址为:https://localhost:5001/notexits_page
我们看到Error404页面
案例2(401错误)
网址:https://localhost:5001/admin/users
1) UseStatusCodePagesWithRedirects
结果:
网址为:https://localhost:5001/error/401
我们堆叠成无限循环
1) UseStatusCodePagesWithRedirects
结果:
网址为:https://localhost:5001/admin/users
我们看到401错误的默认浏览器错误页面