【问题标题】:Importing api has duplicate signature operations azure web api导入api有重复签名操作azure web api
【发布时间】:2018-10-31 19:30:48
【问题描述】:

我正在尝试将我的 swagger 架构导入 azure APIM,但它一直给我重复签名错误。

导入 API 有重复的签名操作:2 个签名为 'GET /api/v1/brokers/{brokerid}' 的操作; 2个带有签名'GET /api/v1/marketreport/{brokerid}'的操作; 2个带有签名'GET /api/v1/offices/{officeid}'的操作; 2 个带有签名的操作 'GET /api/v1/teams/{teamid}'`

我已经仔细检查了我的 API 路由和 swagger 架构,但看不到任何重复。此架构更新在 2018 年 5 月 11 日 azure api 更新之前运行良好。

我已经阅读了release notes,但找不到任何东西。我的端点看起来像这样。

    [Route("{officeId:int:min(1)}", Name = "GetOfficeById")]
    public IHttpActionResult GetOfficeById(int officeId, [FromUri] IncludeImageModel includeImage)
    
    [Route("{brokerId:int:min(1)}", Name = "GetBrokerById")]
    public IHttpActionResult GetBrokerById(int brokerId, [FromUri] IncludeImageModel includeImage)
    
    [Route("{teamId:int:min(1)}", Name = "GetTeamById")]
    public IHttpActionResult GetTeamById(int teamId, [FromUri] IncludeImageModel includeImage)
    
    [Route("MarketReport/{brokerId:int}", Name = "GetMarketReportsByBrokerId")]
    public IHttpActionResult GetMarketReportsByBrokerId(int brokerId, [FromUri]CBBainApi.Models.Common common)

【问题讨论】:

  • 你能分享你的 swagger 文件中的所有路径吗?还是文件本身?

标签: azure asp.net-web-api2 swagger azure-api-management


【解决方案1】:

我已经通过阅读Release notes 中的Path template validation changes 部分解决了这个问题。 由于它统计“改进重复数据删除逻辑”,他们在检查唯一性之前添加了规范化步骤:

如果路径模板包含查询字符串,则? 之后以& 字符分隔的所有段按字母顺序排序,不区分大小写(对= 字符没有任何特殊处理)。

这意味着如果你有两个像下面这样的端点

    [RoutePrefix("brokers")]
    public class BrokerController : ApiController
    
    [HttpGet]
    [Route("{brokerId:int:min(1)}", Name = "GetBrokerById")]
    public IHttpActionResult GetBrokerById(int brokerId, [FromUri] IncludeImageModel includeImage)
    
    [HttpGet]
    [Route("{webUrl}", Name = "GetBrokerByWebUrl")]
    public IHttpActionResult GetBrokerByWebUrl(string webUrl, [FromUri] IncludeImageModel includeImage)

此 APIM 将通过将它们转换为类似来检查唯一性:

"brokers/{brokerId:int:min(1)}" 到 "brokers/{0}" 和 "brokers/{webUrl}" 到 "brokers/{0}"

并且会给出重复签名错误。

两个端点都在移动应用程序中使用,所以我无法更改路由,所以我将两个端点合并到

    [HttpGet]
    [Route("{param}", Name = "GetBroker")]
    public IHttpActionResult GetBroker(string param, [FromUri] IncludeImageModel includeImage)
          {
             int brokerId = default(int);
             if (int.TryParse(param, out brokerId))
                 ... do something
             else
                 ...do something else
            //return something;
        }

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2016-05-05
    • 2017-08-01
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多