UseExceptionHandler和UseStatusCodePagesWithRedirects的区别

12

我一直在阅读有关ASP.NET Core中的错误处理的内容,我发现有这两种方法:

  • UseExceptionHandler("/error")
  • UseStatusCodePagesWithRedirects("/error/{0}");

我想知道这两者之间的区别是什么?它们都会重定向到错误页面,为什么要选择其中一个?我甚至看到有些人同时使用这两个方法。

1个回答

26
你说得对,这两个中间件都提供了错误页面。然而,它们有两种不同的用例,使得在一个应用程序中同时使用它们是有用的。为了理解它们之间的区别,让我们看一下这些中间件内部实际上是如何工作的。
这基本上是StatusCodePages中间件的工作原理:
// …
await _next(context);
// …

// Do nothing if a response body has already been provided.
if (context.Response.HasStarted
    || context.Response.StatusCode < 400
    || context.Response.StatusCode >= 600
    || context.Response.ContentLength.HasValue
    || !string.IsNullOrEmpty(context.Response.ContentType))
{
    return;
}

var statusCodeContext = new StatusCodeContext(context, _options, _next);
await _options.HandleAsync(statusCodeContext);

它通过调用_next来执行管道,并在调用返回后(也就是所有后续中间件都执行完毕后),检查当前的响应:如果存在错误状态码或根本没有内容,则会执行指示HTTP状态码的状态码页。

另一方面,ExceptionHandler中间件则做了完全不同的事情:

try
{
    await _next(context);
}
catch (Exception ex)
{
    // …
    try
    {
        // …

        await _options.ExceptionHandler(context);

        // …
        return;
    }
    catch (Exception ex2)
    {
        // Suppress secondary exceptions, re-throw the original.
        _logger.ErrorHandlerException(ex2);
    }
    throw; // Re-throw the original if we couldn't handle it
}

这将尝试调用中间件管道并捕获可能产生的任何异常。然后,它将尝试运行已注册的异常处理程序(当设置路径时,基本上意味着在内部调用该路径并返回其响应)。
因此,总结一下:
- StatusCodePages中间件将处理非成功的状态码响应,并允许您为404 Not Found等内容指定自定义错误页面。 - 另一方面,ExceptionHandler中间件将捕获应用程序中未处理的异常,并允许您为最终用户优雅地处理这些异常。
两个中间件具有不同的目的,实际上不会重叠。因此,通常包括它们两个是有意义的,除非您当然以不同的方式处理这些问题;例如,API可能不需要状态代码页面,但仍可能希望返回通用失败并正确记录所有内容的异常处理程序。

1
哦,我不知道ExceptionHandler可以处理未处理的异常,这确实非常有帮助。完美的解释,谢谢。 - Haytam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接