Как реализовать управление версиями на уровне контроллера с наследованием? - PullRequest
1 голос
/ 14 мая 2019

у меня ниже структуры контроллера - 1. ValuesController: контроллер 2. ValuesV2Controller: ValuesController 3. ValuesV3Controller: ValuesV2Controller 4. Значения V4Controller: Значения V3Controller

Все контроллеры, имеющие один общий метод Get (Type value); чтобы получить запись perticular. Тип значения отличается в каждом контроллере.

Я реализовал управление версиями в ASP.NET Core Web API с помощью Microsoft.AspNetCore.Mvc.Versioning Nugget.

При запуске> Настройка служб; ниже приведен набор кодов -

services.AddApiVersioning(o =>
        {
            o.ApiVersionReader = new HeaderApiVersionReader("x-lz-api- 
version");
            o.DefaultApiVersion = new ApiVersion(1, 0);
            o.ReportApiVersions = true;
            o.AssumeDefaultVersionWhenUnspecified = true;
         });

Когда мы вызываем API-интерфейсы V1, V2, V3, выдается ошибка 500 not found, особенно для версий, выполняемых с пользовательским заголовком.

Опробованы ниже возможные решения: 1. Создание базового класса виртуальным и переопределение производных классов от них, но, поскольку тип отличается, он не работает. 2. Эта проблема не возникает при управлении версиями URL, это очень характерно для пользовательских версий заголовков.

1 Ответ

1 голос
/ 14 мая 2019

Я не думаю, что вам нужно несколько контроллеров и наследование, чтобы достичь того, что вы пытаетесь сделать.Вы можете просто иметь контроллер с различными методами действия.Затем вы определяете атрибут [ApiVersion] для каждого действия.

[Route("api/values")]
public class ValuesController : ControllerBase
{
    [ApiVersion("1.0")
    public IActionResult GetV1()
    {
    }

    [ApiVersion("2.0")]
    public IActionResult GetV2()
    {
    }

    // and so on ..
}

Если ваш контроллер поддерживает несколько версий, вы можете сопоставить действие определенной версии.

[ApiVersion("1.0")
[ApiVersion("2.0")]
[Route("api/values")]
public class ValuesController : ControllerBase
{
    [MapToApiVersion("1.0")]
    public IActionResult GetV1()
    {
    }

    [MapToApiVersion("2.0")]
    public IActionResult GetV2()
    {
    }

    // and so on ..
}

Если вам необходимоиметь несколько контроллеров, вы можете определить [ApiVersion] для каждого контроллера.Или вы можете установить условные обозначения в файле запуска

services.AddApiVersioning(o =>
{
    o.ReportApiVersions = true;
    o.AssumeDefaultVersionWhenUnspecified = true;
    o.DefaultApiVersion = new ApiVersion(1, 0);

    o.Conventions.Controller<ValuesController>().HasApiVersion(new ApiVersion(1, 0));
    o.Conventions.Controller<ValuesV1Controller>().HasApiVersion(new ApiVersion(2, 0));
});

Вы также можете добавить условные обозначения для конкретного действия, используя метод o.Conventions.Controller<ValuesController>().Actions.

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

...