【问题标题】:ErrorController not invoked未调用错误控制器
【发布时间】:2021-04-13 10:35:18
【问题描述】:

我尝试自定义默认行为,以便在我的 API 控制器内部出现异常时更改返回的内容。

我应用了我在文档中阅读的内容:https://docs.microsoft.com/en-us/aspnet/core/web-api/handle-errors?view=aspnetcore-5.0

Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "todo_list_app v1"));
    }
    else
    {
        app.UseExceptionHandler("/error");
    }
    [...]
}

ErrorController.cs:

[ApiController]
public class ErrorController : ControllerBase
{
    [Route("/error-local-development")]
    public IActionResult ErrorLocalDevelopment(
            [FromServices] IWebHostEnvironment webHostEnvironment)
    {
        if (webHostEnvironment.EnvironmentName != "Development")
        {
            throw new InvalidOperationException(
                    "This shouldn't be invoked in non-development environments.");
        }

        var context = HttpContext.Features.Get<IExceptionHandlerFeature>();

        return Problem(detail: context.Error.StackTrace, title: context.Error.Message);
        }

    [Route("/error")]
    public IActionResult Error() => Problem();
}

【问题讨论】:

  • 我不确定您是否愿意使用一些自定义异常处理程序,您可以在此处查看示例:stackoverflow.com/questions/66222731/…
  • 看起来不错,但我想了解为什么原版在我的情况下不起作用。
  • 您是否在本地开发环境中运行?
  • 我在本地工作,但我构建了版本并通过重命名数据库中的表故意导致异常。
  • 如果您尝试直接访问/error 会怎样?

标签: c# asp.net-core


【解决方案1】:

您的app.UseExceptionHandler("/error"); 表示您的ErrorController 将捕获未处理的异常。你不需要 / 在你的 [Route("/error")] 它应该只是 [Route("error")]

我建议您在此处实现一个主体来实际捕获您的异常并对它们做任何您想做的事情。看看我写的一个非常基本的例子:

[Route("error")]
public ErrorResponseModel Error()
{
    var context = HttpContext.Features.Get<IExceptionHandlerFeature>();
    var exception = context.Error;

    Response.StatusCode = (int)HttpStatusCode.InternalServerError;

    return new ErrorResponseModel(exception);
}

这将捕获您的异常,然后将500 错误附加到它。我在这里使用了一个自定义模型,但你可以返回任何你想要的东西。您还可以进一步扩展此功能并检查您的异常类型并根据您的异常类型返回不同的错误代码。

【讨论】:

    【解决方案2】:

    对于我想要实现的目标,我还必须在开发模式下调用 UseExceptionHandler

    //app.UseDeveloperExceptionPage();
    app.UseExceptionHandler("/error-local-development");
    

    然而,在发布模式下,我没想到

     public IActionResult Error() => Problem();
    

    将返回 nothing 而是一个 HTTP 代码。这与根本没有路线时没有什么不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多