导入 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;
}
我正在尝试将我的 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;
}