【问题标题】:Web Api - Swagger documentation error 500Web Api - Swagger 文档错误 500
【发布时间】:2016-01-03 14:08:40
【问题描述】:

当我访问 swagger url:http://localhost:28483/swagger/ui/index 时,它会生成此错误:

500 : undefined http://localhost:28483/swagger/docs/v1

有什么想法吗?

更新: 在 firebug 中查看此详细错误:

Not supported by Swagger 2.0: Multiple operations
 with path 'api/BimModel' and method 'GET'. See the config setting - \"ResolveConflictingActions\" for
 a potential workaround

【问题讨论】:

  • 你遇到了什么错误?
  • @CuongLe:这就是我在浏览器中得到的一切。

标签: asp.net-web-api swagger


【解决方案1】:

在控制器中,它有两个不同的 GET 操作,并且被 Swagger 禁止。 我建议每个控制器只有一个 GET 操作或modify the router in WebApiConfig

【讨论】:

  • 不幸的是,在 ApiConfig 中修改路由器并没有帮助。仍然得到Not supported by Swagger 2.0: Multiple operations with path...。看起来我必须为每个 get 方法创建新的控制器,或者有没有其他方法可以强制招摇配合(一些属性,...)?
【解决方案2】:

您是否尝试在您的 swagger 配置中启用此功能?

c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

【讨论】:

  • 虽然这可能会解决错误,但其他操作不会以大摇大摆的形式出现。
【解决方案3】:

Swagger 可能会将两个操作视为一个操作(例如在这种常见情况下)...

GET api/Products
GET api/Products/{id}

看来您可以使用attribute routing 来解决此问题,并在您的操作上方使用这些属性,以便 swagger 将分别识别它们。

[Route("api/Products")]

[Route("api/Products/{id:guid}")]

【讨论】:

    【解决方案4】:

    在将属性路由与默认路由混合时,我遇到了同样的问题。 当我删除默认路由时,问题就消失了。缺点是,如果没有定义默认路由,我必须向所有控制器添加属性路由。

    所以我从我的 WebApiConfig 中删除了:

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    

    并将属性路由添加到我的控制器:

    [Route("Session")] // Added this attribute
    public async Task<IHttpActionResult> Get()
    ...    
    [Route("Session/{id}")] // Added this attribute
    public async Task<IHttpActionResult> Get(int id)
    

    实际上,我在控制器上使用[RoutePrefix("Session")],在我的方法上使用[Route("")],但结果应该是一样的。

    【讨论】:

      【解决方案5】:

      由于属性路由语句和方法签名之间的参数名称不匹配,我收到此错误。

      [HttpGet("{id}")]
      public IActionResult Get(string deviceNumber){
      ...
      

      将“{id}”更改为“{deviceNumber}”后,它修复了错误。

      【讨论】:

        【解决方案6】:
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        

        【讨论】:

        • 嘿,欢迎来到 Stackoverflow!请使用英语,因为几乎没有人能够理解您的回答。该网站的理念是一个人提出问题,另一个人回答问题,并为每个有相同问题的人记录相关问题的解决方案。所以,如果只有一小部分人理解你的答案,那就有点浪费了;)