如何处理对路线超控的 swagger ?

qhhrdooz  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(103)

我试图将Swagger嵌入到我的Asp Core(.Net 6)项目中,其中存在一些路由覆盖的情况。然而,我所面临的问题什至可以在以下情况下重现。
考虑一个最小的Asp Core(.Net 6)应用程序。例如,就像Swashbuckle用来测试的应用程序:https://github.com/domaindrivendev/Swashbuckle.AspNetCore/tree/master/test/WebSites/MinimalApp
现在,考虑同一应用程序中的两个控制器:

[ApiController]
[Route("/api")]
public class MyFallbackController : ControllerBase
{
    [HttpGet("values", Order = 1)]
    public ActionResult<object> GetValues()
    {
        return new[] { 1, 2, 3 };
    }
}

[ApiController]
[Route("/api")]
public class MyOverrideController : ControllerBase
{
    [HttpGet("values", Order = 0)]
    public ActionResult<object> GetValues()
    {
        return new[] { 4, 5, 6 };
    }
}

请注意,路由完全相同,但只考虑第一个(Order = 0)。
如果我运行应用程序并导航到:
本地主机:7263
该响应给出了预期结果:[4, 5, 6]
然而,当我尝试访问Swagger部分时,它不起作用,因为(显然)它将控制器对视为冲突:

处理请求时发生未处理的异常。

SwaggerGenerator异常:动作的方法/路径组合“GET api/values”发生恩怨- WebApplication2.MyFallbackController.GetValues(WebApplication 2)、WebApplication2.MyOverrideController.GetValues(WebApplication 2)。对于Swagger/OpenAPI 3.0,动作需要唯一的方法/路径组合。请使用ConflictingActionsResolver做为解决方法
有什么办法可以解决这个问题吗?

fruv7luv

fruv7luv1#

找到了。
顺便说一句,正如异常消息所示,诀窍在于SwaggerGen配置。

using Microsoft.AspNetCore.Mvc.ApiExplorer;

        services.AddSwaggerGen(c =>
        {
            c.ResolveConflictingActions(apiDescriptions =>
            {
                int best_order = int.MaxValue;
                ApiDescription? best_descr = null;
                foreach (var curr_descr in apiDescriptions)
                {
                    int curr_order = curr_descr.ActionDescriptor.AttributeRouteInfo?.Order ?? 0;
                    if (curr_order < best_order)
                    {
                        best_descr = curr_descr;
                    }
                }
                return best_descr;
            });
        });

基本上,上述函数仅选择副本中具有最低阶的ApiDescription
这是我天真而有效的解决方案。例如,我不知道输入集合是否已经按顺序排序。在这种情况下,代码可能会更简单。

相关问题