Импорт API имеет дублирующую подпись операции Azure Web API - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь импортировать свою схему 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, но не вижу никаких дубликатов.Это обновление схемы работало нормально до 11 мая 2018 года обновления Azure API.

Я прочитал заметки о выпуске , но ничего не смог найти.Мои конечные точки выглядят так.

[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)

1 Ответ

0 голосов
/ 25 мая 2018

Я исправил эту проблему, прочитав часть 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...