Маршрутизация атрибута Ограниченный маршрут
Я использую пакет http://attributerouting.net/ nuget для WebApi. Вот мои два метода GET и атрибуты маршрута для списка и определенного элемента:
[GET("api/products/{tenantid}/{channelid}?{skip=0}&{take=20}&{status=1}")]
public IEnumerable<Product> Get(short tenantId, byte channelId, int status, int skip, int take)
[GET("api/products/{tenantid}/{channelid}/{id}")]
public Story Get(short tenantId, byte channelId, long id)
Но в сгенерированных URI справки показаны три параметра GET.
GET api/products/{tenantid}/{channelid}?status={status}&skip={skip}&take={take}
GET api/products/{tenantid}/{channelid}?id={id}
GET api/products/{tenantid}/{channelid}/{id}
даже если "id" не является параметром для первого метода GET. Как мне удалить средний URI с "? Id={id}" в конце? Я предполагаю, что мне нужно какое-то ограничение, но я не могу понять это с сайта документации.
1 ответ
Чтобы решить эту проблему, вы можете назвать действия по-разному. Пример: GetAllProducts, GetProduct
Проблема, которую вы видите, является ожидаемым поведением, потому что ApiExplorer(который использует HelpPage) посещает все маршруты в коллекции маршрутов и для каждого маршрута он проверяет, какие действия могут быть достигнуты по этому маршруту. Теперь с указанным атрибутом оформленных маршрутов, маршруты в коллекции маршрутов, скорее всего, будут выглядеть так:
а. "api/products/{tenantid}/{channelid}", controller="Products", action = "Get" и т. д...
б. "api/products/{tenantid}/{channelid}/{id}", controller="Products", action = "Get"...
Теперь для маршрута "a." ApiExplorer проверяет, какие действия могут быть достигнуты, и замечает, что для контроллера "Продукты" и действия "Получить", есть 2 действия, которые могут быть достигнуты, а также пытается увидеть, сколько параметров исходящий из самого пути маршрута, и если в действии есть какие-либо параметры, не входящие в путь маршрута, он предполагает, что он поступает из строки запроса... следовательно, вы видите "?id={id}". Надеюсь это поможет.