ASP.NET 没有 HTTP 动词的核心错误处理程序抛出 Swashbuckle 异常
ASP.NET Core error handler without HTTP verb throws Swashbuckle exception
在 docs 中用于错误处理的是这样的:
Warning
Don't mark the error handler action method with HTTP method attributes, such as HttpGet. Explicit verbs prevent some requests from reaching the action method.
所以它推荐这个:
[ApiController]
public class ErrorController : ControllerBase
{
//[HttpGet] <-- docs say not to do this
[Route("/error")]
public IActionResult Error() => Problem();
}
然而,当我遵循该建议(而不是 [HttpGet("/error")]
)时,我从 Swashbuckle 得到了这个错误:
Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorException: Ambiguous HTTP method for action - ErrorController.Error. Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0
显然,当我包含动词时,它起作用了。
有人可以在文档中解释该建议背后的原因吗?
文档中建议的原因是在发生错误时允许任何类型的 HTTP 请求到达错误处理程序。例如,如果您将其标记为 [HttpGet]
,它将无法处理 POST 请求中的错误。
为了让它与 Swagger 一起玩得很好,你可以用这个属性标记控制器(甚至是特定的动作):
[ApiExplorerSettings(IgnoreApi = true)]
这将导致 Swashbuckle 不为其生成元数据并且不在 Swagger 中显示它 UI。
在 docs 中用于错误处理的是这样的:
Warning
Don't mark the error handler action method with HTTP method attributes, such as HttpGet. Explicit verbs prevent some requests from reaching the action method.
所以它推荐这个:
[ApiController]
public class ErrorController : ControllerBase
{
//[HttpGet] <-- docs say not to do this
[Route("/error")]
public IActionResult Error() => Problem();
}
然而,当我遵循该建议(而不是 [HttpGet("/error")]
)时,我从 Swashbuckle 得到了这个错误:
Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorException: Ambiguous HTTP method for action - ErrorController.Error. Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0
显然,当我包含动词时,它起作用了。
有人可以在文档中解释该建议背后的原因吗?
文档中建议的原因是在发生错误时允许任何类型的 HTTP 请求到达错误处理程序。例如,如果您将其标记为 [HttpGet]
,它将无法处理 POST 请求中的错误。
为了让它与 Swagger 一起玩得很好,你可以用这个属性标记控制器(甚至是特定的动作):
[ApiExplorerSettings(IgnoreApi = true)]
这将导致 Swashbuckle 不为其生成元数据并且不在 Swagger 中显示它 UI。