我在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);
}
});
}
答案 0 :(得分:5)
问题在于您将中间件添加到应用程序的顺序。由于您在自定义中间件之后添加了异常处理程序,因此异常过滤器不会涵盖此中间件抛出的任何异常。
修复非常简单。只需更改中间件注册的顺序,以便首先注册异常过滤器:
app.UseExceptionHandler(GlobalErrorHandler);
app.UseCustomMiddleware();
app.UseMvc();
现在异常处理程序将成功处理从自定义中间件抛出的异常。