【问题标题】:Asp.Net 5/Core app.UseExceptionHandler() not workingAsp.Net 5/Core app.UseExceptionHandler() 不工作
【发布时间】:2021-05-28 22:26:46
【问题描述】:

我在启动中

(更新:解决方案是将 UseRouting 移到 /api/error 路由下)


app.UseRouting();

if (env.IsDevelopment()) {               
    app.UseExceptionHandler("/api/error/error-local-development"); 
    SwaggerConfig.Configure(app);              
}
else {             
    app.UseExceptionHandler("/api/error/error");
}

 app.UseCors();
 app.UseHttpsRedirection();
 app.UseDefaultFiles();
 app.UseSpaStaticFiles(); 
 app.UseAuthentication();
 app.UseAuthorization();
 app.UseRequestLocalization(options);
  app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHub<ResultHub>("/hubs/resultHub");
            });


            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "wwwroot";
            });

但是当throw new Exception() 在控制器操作中时,永远不会调用错误控制器方法。

[Route("api/error")]
[ApiController]
[ApiExplorerSettings(IgnoreApi = true)]
public class ErrorController : OwnBaseController
{
    public ErrorController(IApplicationUserService applicationUserService, ILogger<ErrorController> logger, IDiagnosticContext diagnosticContext) : base(applicationUserService, logger, diagnosticContext)
    {
    }

    [Route("error")]
    public IActionResult Error()
    {
        return Problem(); 
    }

    [Route("error-local-development")]
    public IActionResult ErrorLocalDevelopment([FromServices] IWebHostEnvironment webHostEnvironment)
    {
       var context = HttpContext.Features.Get<IExceptionHandlerFeature>();
       return Problem(
            detail: context.Error.StackTrace,
            title: context.Error.Message);
    }
}

【问题讨论】:

  • 接下来会发生什么?我的意思是应用程序崩溃还是日志中出现异常?还是 xyz?
  • 在调试模式中,我在手册“抛出异常”serilog 日志中看到“在 xxx.dll 中发生了类型 xx 的异常,但未在用户代码中处理”,然后跳转到我的测试控制器的测试方法并返回 500。
  • 您将UseExceptionHandler 调用放在UseRoutingUseEndpoints 之前或之后的位置?
  • 在 app.UseRouting() 之后
  • 请先尝试注册。这些可能是Configure 中的第一个方法调用。

标签: c# error-handling asp.net5


【解决方案1】:

这可能看起来很奇怪,但顺序很重要。

UseExceptionHandlerUseRouting 都在后台注册中间件。

首先注册的将是最外层的中间件。因此,如果内部抛出异常,外部可以捕获并处理(和/或记录)它。

Source

MSDN 对此有一些警告,例如:

如果指定了应用程序中的端点,则为该端点创建 MVC 视图或 Razor 页面。确保将UseStatusCodePagesWithReExecute 放在UseRouting 之前,以便可以将请求重新路由到状态页面。

UseExceptionHandler 是添加到管道的第一个中间件组件。因此,异常处理程序中间件会捕获以后调用中发生的任何异常。

【讨论】:

  • 我真的希望这个简单的解决方案能解决我的问题。我对 UseExceptionHandler 的调用是先调用的,但是未处理的异常仍然没有调用错误处理控制器。这个问题肯定有其他原因。
  • 嗨@MatthewMacFarland,您能否分享更多详细信息以便为您提供帮助? (如果需要,请创建一个新问题并在此处粘贴链接)
  • 嗨@PeterCsala,当然可以。我会将我的详细信息放在一起并尽快发布。
  • 嗨@PeterCsala,我在准备在这里发布详细信息时发现了我的问题。我在开发模式下运行,对app.UseExceptionHandler() 的调用仅在IsDevelopmentMode = false 时有效。愚蠢的错误。现在一切正常。
  • 嗨@MatthewMacFarland 这发生在每个人身上,不用担心。很高兴你能自己解决。
猜你喜欢
  • 2021-12-25
  • 2021-10-05
  • 2021-09-16
  • 1970-01-01
  • 2022-07-08
  • 2021-06-17
  • 2017-07-14
  • 2020-03-16
  • 1970-01-01
相关资源
最近更新 更多