gpt4 book ai didi

c# - UseExceptionHandler 与 UseStatusCodePagesWithRedirects

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:31 27 4
gpt4 key购买 nike

我一直在阅读 ASP.NET Core 中的错误处理,我遇到了这两种方式:

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

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

最佳答案

你是对的,两个中间件都提供了错误页面。但是,它们有两个不同的用例,这使得在应用程序中实际同时使用它们很有用。要了解差异,让我们看一下中间件在内部的实际工作方式。

这本质上就是 StatusCodePages middleware 的内容做:

// …
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 middleware另一方面做了一些非常不同的事情:

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 可能不需要状态代码页,但可能仍需要一个异常处理程序来返回一般故障并正确记录所有内容。

关于c# - UseExceptionHandler 与 UseStatusCodePagesWithRedirects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51118839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com