AssumeDefaultVersionWhenUnspecified не работает должным образом - PullRequest
0 голосов
/ 25 сентября 2018

Я использовал компонент управления версиями asp net core для моего WebAPI.Нужна ваша помощь в понимании того, как работает AssumeDefaultVersionWhenUnspecified.(попытался найти документацию, но не смог ее найти)

Мой запуск выглядит следующим образом

services.AddApiVersioning(o => {
            o.ReportApiVersions = true;
            o.AssumeDefaultVersionWhenUnspecified = true;
            o.DefaultApiVersion = new ApiVersion(2, 0);
            o.ApiVersionReader = new UrlSegmentApiVersionReader();
        });

Когда атрибут маршрута выглядит примерно так:

[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/values")]
[ApiController]
public class ValuesV2Controller : ControllerBase
{
...
}

Вышеуказанный маршрут работает, только если указана версия API.то есть: http://localhost:55401/api/v2/values Если я позвоню как http://localhost:55401/api/values, получая ошибку 404

Мой вопрос такой ... Как работает AssumeDefaultVersionWhenUnspecified.Разве это не проигнорирует версию в Route?Похоже, атрибут Route имеет приоритет над AssumeDefaultVersionWhenUnspecified.Если я выбираю QueryString или Header versioning, и когда маршрут выглядит как

[ApiVersion("2.0")]
[Route("api/values")]

, по умолчанию маршрутизация достигает API

Я что-то упустил или мое понимание неверно?Как мне добиться маршрутизации по умолчанию к API последней версии с использованием URL-версий?

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

Суммируя решение проблемы github, связанной с Athi S, вы должны сделать следующее:

В ConfigureServices внутри файла Startup.cs:

        services.AddApiVersioning(o =>
        {
            o.AssumeDefaultVersionWhenUnspecified = true;
            o.ApiVersionSelector = new CurrentImplementationApiVersionSelector(o);
            //  o.DefaultApiVersion = new ApiVersion(1, 0);
        });

При желании вы можете установить ApiVersionSelector на новый экземпляр CurrentImplementationApiVersionSelector.Это автоматически выбирает самую высокую версию API, зарегистрированную в контроллерах.Например, контроллер, украшенный [ApiVersion ("1.2")], имеет приоритет над [ApiVersion ("1.1")].

Если вы хотите явно указать версию api по умолчанию, вы можете оставить ApiVersionSelector в DefaultApiVersionSelectorи установка DefaultApiVersion на требуемую версию API.

В ваших контроллерах:

Зарегистрируйте необходимые маршруты, украсив свои контроллеры с заданными атрибутами Route

[Route("api/[controller]")]

Или, если вы хотите, чтобы API работал как с указанным номером версии API, так и без него, вы можете сделать это, объявив два маршрута для контроллера.

[Route("api/[controller]")]
[Route("api/v{version:apiVersion}/[controller]")]
0 голосов
/ 12 августа 2019

Я также пытаюсь достичь той же функциональности.Рассматривая [https://github.com/Microsoft/aspnet-api-versioning/issues/351#issuecomment-425106940], я предполагаю, что мы не можем достичь функциональности API версии по умолчанию AssumeDefaultVersionWhenUnspecified, только с одним стилем управления версиями используется сегмент URL [Route("api/v{version:apiVersion}/[controller]")]

Мы должны определитьдва маршрута по отдельности, как следует

  1. [Route("api/[controller]")]
  2. [Route("api/v{version:apiVersion}/[controller]")]

и скрыть две реализации от чванства, которые вы можете получить с помощью этого ссылка

0 голосов
/ 27 сентября 2018

Короче, мое понимание было неверным.Спасибо Крис за разъяснения.Вы можете получить больше информации от https://github.com/Microsoft/aspnet-api-versioning/issues/351#issuecomment-425106940

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...