在AspNetCore

时间:2018-04-06 13:52:49

标签: asp.net-core exception-handling asp.net-core-middleware

我在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);
       }
     });
}

1 个答案:

答案 0 :(得分:5)

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

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

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

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