Как выполнить управление версиями api в .net core?

#c# #.net #asp.net-core

#c# #.net #asp.net-core

Вопрос:

Я написал контроллер, подобный приведенному ниже (.net core 2.1):

 [ApiVersion("1")]
[Consumes("application/json")]
[Produces("application/json")]
[Route("v{version:apiVersion}/[controller]")]
public class AccountController : ControllerBase
{
    // GET: api/Account
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}
  

Я вызываю вышеупомянутый контроллер таким образом (вызов swagger):

 curl -X GET "https://localhost:44363/v1/Account" -H "accept: application/json"
  

Но я продолжаю получать ошибку 404, подобную приведенной ниже.

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET /v1/Account</pre>
</body>
</html>
  

Не уверен, что я делаю не так. Любая помощь высоко ценится!

Комментарии:

1. Есть ли какая-либо демонстрация, чтобы воспроизвести вашу проблему? В чем заключается ваш Startup.cs ? Я не могу воспроизвести вашу проблему с текущими настройками.

Ответ №1:

Вам не нужно предоставлять маршрут подобным образом, поскольку он уже известен системой управления версиями api.

Прежде всего, вам следует настроить управление версиями api, например:

 public void ConfigureServices( IServiceCollection services )
{
    services.AddMvc();
    services.AddApiVersioning(o => o.ApiVersionReader = new HeaderApiVersionReader("api-version"));

    //and the rest
}
  

А затем простая настройка:

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

Это создаст версию api по умолчанию и предполагает, что если в запросе не указана версия, будет рассмотрена версия по умолчанию.

Далее ваш контроллер должен выглядеть следующим образом:

 [ApiVersion( "1" )]
[Route( "api/mystuff" )]
public class mystuff1: Controller 
{
    [HttpGet]
    public string Get() => "Mystuff1!";
}


[ApiVersion( "2" )]
[Route( "api/mystuff" )]
public class mystuff2 : Controller 
{
    [HttpGet]
    public string Get() => "Mystuff2!";
}
  

Затем просто добавьте заголовок к вашему запросу:
api-версия: 2

(это делается с помощью AddApiVersioning в ConfigureServices).

Комментарии:

1. извините, это не сработало. По-прежнему выдает ошибку 404: (Что-то изменилось в 2.1 по сравнению с 2.0?

2. Вы уверены, что у вас есть версия api в вашем заголовке при отправке запроса? Вы уверены, что у вас правильное именование? Например, «api-version» вместо: «api-verson»?