导入 api 具有重复的签名操作 azure web api

Importing api has duplicate signature operations azure web api

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

Importing API has duplicate signature operations: 2 operations with signature 'GET /api/v1/brokers/{brokerid}'; 2 operations with signature 'GET /api/v1/marketreport/{brokerid}'; 2 operations with signature 'GET /api/v1/offices/{officeid}'; 2 operations with signature 'GET /api/v1/teams/{teamid}'`

我已经仔细检查了我的 API 路由和 swagger 架构,但看不到任何重复项。此架构更新在 2018 年 5 月 11 日之前运行良好 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)

我通过阅读 Release notes 中的 Path template validation changes 部分解决了这个问题。 正如它对 'improve deduplication logic' 所述,他们在检查唯一性之前添加了规范化步骤:

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

这意味着如果您有两个端点,如下所示

    [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;
        }