在 Asp Net Core 中使用全局异常处理程序和自定义中间件
Using GlobalExceptionHandler and custom Middleware in AspNetCore
我在 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();
现在自定义中间件抛出的异常将被异常处理程序成功处理。
我在 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();
现在自定义中间件抛出的异常将被异常处理程序成功处理。