Я не могу показать версии API в заголовке ответа с ApiVersioning. net Core - PullRequest
0 голосов
/ 31 марта 2020

Я следую инструкции Версии API REST с ASP. NET Core , чтобы показать версию My API в заголовке ответа.

Это мой Код конфигурации :

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddMvc().AddNewtonsoftJson();
        services.AddMvc(opt =>
        {

        services.AddRouting(env => env.LowercaseUrls = true);
        services.AddApiVersioning(opt => {
            opt.ApiVersionReader = new MediaTypeApiVersionReader();
            opt.AssumeDefaultVersionWhenUnspecified = true;
            opt.ReportApiVersions = true;
            opt.DefaultApiVersion = new ApiVersion(1, 0);
            opt.ApiVersionSelector = new CurrentImplementationApiVersionSelector(opt);
        });
    }

и это мой контроллер :

[Route("/")]
[ApiVersion("1.0")]
public class RootController:Controller
{
    [HttpGet(Name =nameof(GetRoot))]
    public IActionResult GetRoot()
    {
        var response = new { href = Url.Link(nameof(GetRoot),null) };
        return Ok(response);
    }
}

, когда я тестирую свой API с почтальоном, я получил такой результат:

enter image description here

Я не знаю, почему opt.ReportApiVersions = true; не работает.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Причина , почему ведет себя таким образом, заключается в устранении неоднозначности контроллера API от контроллера пользовательского интерфейса. В ASP. NET Core на самом деле нет другого встроенного способа сделать это, так как - контроллер - это контроллер .

Есть несколько других способов изменить это поведение:

  • Отказаться с options.UseApiBehavior = false, как было раньше [ApiController]
  • Добавить пользовательскую IApiControllerSpecification , которая идентифицирует контроллер API (есть встроенная реализация, которая понимает [ApiController])
  • Заменить службу по умолчанию IApiControllerFilter , которая на самом деле является просто агрегацией для всех зарегистрированных IApiControllerSpecification реализаций

Надеюсь, это поможет

0 голосов
/ 31 марта 2020

Я нашел решение. Я должен добавить [ApiController] к моему контроллеру:

[Route("/")]
[ApiVersion("1.0")]
[ApiController]
public class RootController:Controller
{
    [HttpGet(Name =nameof(GetRoot))]
    public IActionResult GetRoot()
    {
        var response = new { href = Url.Link(nameof(GetRoot),null) };
        return Ok(response);
    }
}
...