Неподдерживаемая версия API с версиями в URI - что не так? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть проект Web API, использующий .net core 2.2 (возможно, здесь есть проблема.)

Маршруты ожидают OAuth-авторизации с OpenIdDict, но это прекрасно работает для меня.Я пытаюсь очень простой подход:

Файл startup.cs просто содержит:

services.AddApiVersioning();

Контроллер API имеет три различных маршрута для целей тестирования.Обратите внимание, что сам контроллер не имеет аннотаций [Route ()] или [ApiVersion ()].

[HttpGet]
[Authorize]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/vt")]
public IActionResult GetVt20()
{
    return Ok("2.0");
}

[HttpGet]
[Authorize]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/vt")]
public IActionResult GetVt10()
{
    return Ok("1.0");
}

Если я сделаю авторизованный запрос, например,

http://localhost:27713/api/v1.0/vt

.net core ответит BadRequest:

{"error":{"code":"UnsupportedApiVersion","message":"The HTTP resource that matches the request URI 'http://localhost:27713/api/v1.0/vt' does not support the API version '1.0'.","innerError":null}}

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

У меня была такая же проблема при миграции с 2.1 net core на 2.2. Просто добавьте в свой класс контроллера [ApiController] Атрибут

Github Issue

0 голосов
/ 25 апреля 2019

Вы используете последние версии библиотек?Используете ли вы маршрутизация конечной точки или устаревшая маршрутизация ?Как выглядит остальная часть вашей конфигурации?С предоставленной вами ограниченной информацией я не вижу непосредственной причины, по которой она не будет работать.

Вот рабочий пример, основанный на предоставленной вами информации:

[ApiController]
public class VTController : ControllerBase
{
    [HttpGet]
    [ApiVersion( "1.0" )]
    [Route( "api/v{version:apiVersion}/[controller]" )]
    public IActionResult Get( ApiVersion apiVersion ) =>
        Ok( new { Action = nameof( Get ), Version = apiVersion.ToString() } );

    [HttpGet]
    [ApiVersion( "2.0" )]
    [Route( "api/v{version:apiVersion}/[controller]" )]
    public IActionResult GetV2( ApiVersion apiVersion ) =>
        Ok( new { Action = nameof( GetV2 ), Version = apiVersion.ToString() } );
}

Следующие маршруты разрешаются должным образом:

  • http://localhost/api/v1/vt
  • http://localhost/api/v2/vt
...