UseStatusCodePagesWithRedirects和UseStatusCodePagesWithReExecute之间的区别 - Asp.net核心中的状态代码页

时间:2018-05-17 21:02:49

标签: asp.net-core .net-core asp.net-core-mvc

我正在使用UseStatusCodePages中间件在我的应用程序上显示状态代码页,但它在UI上显示纯文本而没有任何其他信息,

我希望显示带有状态代码信息的用户界面以及其他一些有用的信息,例如客户支持号码以及更加用户友好的页面。

我发现我们可以使用两种扩展方法来实现UseStatusCodePagesWithRedirects和UseStatusCodePagesWithReExecute。我发现Microsoft Docs只有差异,

UseStatusCodePagesWithRedirects :将302发送给客户。

UseStatusCodePagesWithReExecute :发送原始状态代码并执行重定向网址处理程序。

这是唯一的区别吗?

3 个答案:

答案 0 :(得分:1)

从最终用户的角度来看,无论使用哪种中间件组件,行为都没有区别。在这两种情况下,我们都会看到指定的自定义错误视图。

UseStatusCodePagesWithRedirects

  • app.UseStatusCodePagesWithRedirects(“ / Error / {0}”);
  • http://localhost/foo/bar发出请求时
  • 由于此URL与我们的应用程序中的任何路由都不匹配 状态代码404被引发
  • UseStatusCodePagesWithRedirects中间件组件拦截 404状态代码,顾名思义,将重定向到 提供的错误路径(在我们的示例中为“ / Error / 404”)

使用UseStatusCodePagesWithRedirects请求处理

  • http://localhost/foo/bar发出请求时
  • 出现404状态代码
  • StatusCodePagesWithRedirects中间件拦截并更改 它指向302,将其指向错误路径(/ Error / 404)
  • 302状态码表示所请求资源的URI已被 暂时更改,在我们的情况下,更改为/ Error / 404
  • 因此发出了另一个GET请求以服务重定向的请求 由于发出了重定向,因此请注意地址栏中的URL 从/ foo / bar更改为/ Error / 404
  • 请求流经管道并由MVC处理 最终返回带有状态的NotFound视图HTML的中间件 代码200(表示请求已成功完成)
  • 就浏览器而言,整个请求流程在那里 没有404错误。
  • 如果您仔细观察此请求和响应流程,我们将 实际出错时返回成功状态代码(200) 发生在语义上不正确的事情。

Redirect

使用UseStatusCodePagesWithReExecute请求处理

  • app.UseStatusCodePagesWithReExecute(“ / Error / {0}”)
  • http://localhost/foo/bar发出请求时
  • 出现404状态代码
  • UseStatusCodePagesWithReExecute中间件截获404状态 代码并重新执行将其指向URL的管道 (/ Error / 404)
  • 请求流经管道并由MVC处理 返回NotFound视图HTML以及状态代码的中间件 200
  • 当响应流出到客户端时,它通过 使用HTML的UseStatusCodePagesWithReExecute中间件 响应,但将200状态代码替换为原始404 状态代码。
  • 这是一个聪明的中间件。顾名思义 重新执行保持正确(404)状态代码的管道。它只是返回自定义视图(NotFound)HTML。
  • 因为它只是重新执行管道而没有发出重定向 请求,我们还将在地址栏中保留原始URL(/ foo / bar)。它不会从/ foo / bar更改为/ Error / 404。

Execute

如果您使用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”)时会引发

  • 已发出状态代码404,app.UseStatusCodePagesWithRedirects(“ / Error / {0}”)截获该请求并发出了302状态代码(这意味着所请求资源的URI已被临时更改)
  • 当发出302时,发出另一个获取请求,该请求导致url的更改 “ / abc / xyz”到“ / Error / 404”。
  • 当请求被重定向到特定的错误控制器时,在浏览器开发人员工具中,请求的状态代码为200 。

但是在使用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错误的默认浏览器错误页面