UseExceptionHandler 与 UseStatusCodePagesWithRedirects

2024-06-22

我一直在阅读有关 ASP.NET Core 中的错误处理的内容,并且遇到了以下两种方法:

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

我想知道两者有什么区别?两者都重定向到错误页面,那么为什么要使用其中一个而不是另一个呢?我什至看到有些人同时使用它们。


你是对的,两个中间件都提供了错误页面。然而,它们有两个不同的用例,这使得在应用程序中同时使用这两个用例非常有用。为了理解这些差异,我们来看看中间件的内部实际工作原理。

这本质上就是StatusCodePages 中间件 https://github.com/aspnet/Diagnostics/blob/2.1.1/src/Microsoft.AspNetCore.Diagnostics/StatusCodePage/StatusCodePagesMiddleware.cs does:

// …
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 状态代码。

The 异常处理中间件 https://github.com/aspnet/Diagnostics/blob/2.1.1/src/Microsoft.AspNetCore.Diagnostics/ExceptionHandler/ExceptionHandlerMiddleware.cs另一方面做了一些非常不同的事情:

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
}

这会try调用中间件管道并捕获它可能产生的任何异常。然后,它将尝试运行已注册的异常处理程序(设置路径时基本上意味着在内部调用该路径并返回其响应)。

总结一下:

  • The StatusCodePages 中间件将处理不成功的情况状态码响应并允许您指定例如自定义错误页面,例如 404 Not Found。
  • The 异常处理中间件另一方面会抓住未处理的异常在您的应用程序中,并允许您为最终用户优雅地处理这些问题。

两个中间件都有不同的用途,实际上它们的功能并不重叠。因此,将两者都包含在内通常是有意义的,当然,除非您以不同的方式处理这些问题;例如API 可能不需要状态代码页,但可能仍然需要一个异常处理程序来返回一般故障并正确记录所有内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UseExceptionHandler 与 UseStatusCodePagesWithRedirects 的相关文章

  • Winapi:获取具有特定文件句柄的进程

    目前我有一个带有文件过滤器驱动程序的软件 在软件安装过程中 驱动程序以以下方式作为服务启动 CreateService serviceManager name displayName SERVICE START DELETE SERVICE
  • dlclose() 不卸载链接到 boost 的 .so 文件

    如果我的应用程序加载 使用 dlopen 一个链接到 Boost 测试框架的 so 文件 我无法卸载该 so 文件 如果没有链接到 boost 卸载它似乎就可以了 应用程序文件main cpp include
  • 自定义 C# 对象可以包含与其自身类型相同的属性吗?

    如果我创建了以下内容Employee对象 简化 public class Employee public Employee public String StaffID get set public String Forename get s
  • Discord OAuth 代码使用

    我对使用 Discord API 与 Discord 进行交互感兴趣 我会把他们的文档描述为 稀疏 但也许我只是没有在正确的地方寻找 我的大部分信息都来自这个页面 https discordapp com developers docs t
  • Excel 在 CSV 导出中添加额外的引号

    我最近创建了一个应用程序 它通过 CSV 将项目添加到数据库 添加项目后 我意识到我的很多值都有不需要的额外引号 这扰乱了我的排序 问题是 当从 Excel 导出到 CSV 时 Excel 会向我所有已包含引号的值添加额外的引号 我在下面展
  • KeyVaultErrorException:操作返回无效的状态代码“禁止”

    我正在尝试设置托管在 Azure 中的 Web 应用程序以从 Azure KeyVault 读取设置 我一直在遵循这个指南 https anthonychu ca post secrets aspnet core key vault msi
  • 在 WPF 中,PreviewTextInput 是否始终只给出单个字符?

    处理时PreviewTextInputWPF 中 TextBox 的事件 可以使用事件参数的 Text 属性 TextCompositionEventArgs 包含除通过键盘输入的最后一个字符以外的字符 我对它进行了彻底的测试 它似乎只包含
  • .Net Core 1.1 上的 OData v4 缺少 /$metadata

    使用 net Core 1 1 和 Microsoft AspNetCore OData 库 我能够让 OData 端点与我的简单控制器配合使用来执行 get expand 和其他查询 但是 我无法让它返回要返回的 metadata 这个问
  • 执行类的成员函数

    我正在尝试以一种方式试验 C 11 线程 它接受类的成员函数作为线程构造函数的参数 如下面第 20 行标记为 的第一个代码片段所示 类定义在第二个代码片段中给出 编译此代码时 我收到第三个片段中显示的一堆错误 谁能告诉我我做错了什么 谢谢
  • CompiledQuery 与 Plain Linq SQL 生成

    因此 我正在对访问 SQLServer 数据库的不同方法进行一些分析 我使用了普通的 TSQL CompiledQuery 和非编译的 Linq 语句 正如预期的那样 性能按照相同的顺序进行 但在分析后两者时我注意到一些奇怪的事情 Comp
  • 从进程中获取当前打开的Word文档

    目标是获取在我有流程参考的 Microsoft Word 实例中打开的文档的完整路径 伪代码示例 Process myWordProcess something This is my process reference DocumentIn
  • 在 C# 中生成 Excel 列字母的最快函数

    接受 int 并返回包含一个或多个字母的字符串以便在 Excel 函数中使用的最快 C 函数是什么 例如 1 返回 A 26 返回 Z 27 返回 AA 等 这被调用了数万次 并且占用了生成包含许多公式的大型电子表格所需时间的 25 pub
  • 进程退出时释放绑定端口

    如何确保绑定到端口的套接字在进程退出时正确释放 以便可以重用该端口而无需bind EADDRINUSE 失败 我编写了一个小程序 它只创建一个套接字 将其绑定到一个固定端口 等待连接 然后立即终止 当我重新运行程序时 bind 调用因 EA
  • 椭圆旋转矩阵?

    在 C 中 我们可以绕任意轴旋转一个点 void radRotateAxis float a float b float c float theta float newX x a a 1 cos theta cos theta y a b
  • QSqlDatabasePrivate::removeDatabase:连接“myConnectionName”仍在使用中,所有查询将停止工作

    我有一个文件夹 里面有很多数据库 有时可能会删除或添加数据库到该文件夹 所以我使用 QTimer 并读取所有数据库 这是我的代码 this gt timer new QTimer this this gt timer gt setInter
  • 什么可能导致 sock send() 命令上的“资源暂时不可用”

    什么会导致Resource temporarily unavailable套接字上的错误send 命令 套接字设置为AF UNIX SOCK STREAM 它在大多数情况下都有效 但偶尔会出现此错误 套接字的接收端似乎工作正常 我知道这不是
  • 预加载整个模型以估计 Tensorflow Serving 的内存消耗

    当执行预测时 Tensorflow Serving 延迟初始化模型 DAG 中的节点 这使得很难估计保存整个模型所需的内存 RAM 是否有一种标准方法可以强制 Tensorflow Serving 将模型完全初始化 加载到内存中 您可以使用
  • CodeLite 配色方案(主题)对于 C 来说很混乱

    我最近将 CodeLite for Linux Debian 更新到版本 14 0 我主要将 CodeLite 用于 C 看起来 IDE 搞乱了颜色主题 这里我有之前 CodeLite 13 0 https i stack imgur co
  • 将 Google 云端硬盘访问权限委派给服务帐户失败

    我参与构建了一个内部使用的应用程序 用户可以通过该应用程序上传文件 并将其存储在 Google Drive 中 由于建议不要使用服务帐户作为文件所有者 因此我希望代表公司系统管理员有权访问的指定用户帐户上传应用程序 我已经创建了该应用程序以
  • 使用和重载基类的模板成员函数?

    下面 构造Y超载X的成员函数f 两个重载都是模板函数 但采用不同的参数 typename and int 明确指定 struct X template

随机推荐