gpt4 book ai didi

asp.net-core - 在 Asp Net Core 中使用全局异常处理程序和自定义中间件

转载 作者:行者123 更新时间:2023-12-01 11:16:55 44 4
gpt4 key购买 nike

我在 AspNetCore 中使用 app.UseExceptionHandler(GlobalErrorHandler),然后是自定义中间件。当单独使用它们时,它们工作正常,但当同时使用它们时,异常会在我的自定义中间件中抛出并使调用崩溃。这发生在 await _next.Invoke(context) 上。我也尝试使用 ExceptionFilter 但结果相同。我的全局异常处理看起来像这样。有没有办法阻止异常冒泡?

  app.UseCustomMiddleware();
app.UseExceptionHandler(GlobalErrorHandler);
app.UseMvc();


private void GlobalErrorHandler(IApplicationBuilder applicationBuilder)
{
applicationBuilder.Run(
async context =>
{
context.Response.ContentType = "text/html";
var ex = context.Features.Get<IExceptionHandlerFeature>();
if (ex != null)
{
string errorMessage;
var webFault = ex.Error as WebFaultException<string>;
if (webFault != null)
{
context.Response.StatusCode = (int)webFault.StatusCode;
errorMessage = webFault.Detail;
}
else
{
if (ex.Error is UnauthorizedAccessException)
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
errorMessage = string.Empty;
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
errorMessage = ex.Error.Message + new StackTrace(ex.Error, true).GetFrame(0).ToString();
}

_logger.Error(errorMessage, ex.Error);
}

await context.Response.WriteAsync(errorMessage).ConfigureAwait(false);
}
});
}

最佳答案

问题在于您将中间件添加到应用程序的顺序。由于您在自定义中间件之后添加了异常处理程序,因此该中间件抛出的任何异常都不会被异常过滤器覆盖。

修复非常简单。只需改变中间件注册的顺序,让异常过滤器先注册:

app.UseExceptionHandler(GlobalErrorHandler);
app.UseCustomMiddleware();
app.UseMvc();

现在自定义中间件抛出的异常将被异常处理程序成功处理。

关于asp.net-core - 在 Asp Net Core 中使用全局异常处理程序和自定义中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49694405/

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