在 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();

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