Версионный API с Swagger не обнаруживает операции API

Я реализовал API и интегрировал его с Swagger.

Запуск ConfigureServices:

services
    .AddMvcCore()
    .AddApiExplorer();

services.AddSwaggerGen(c => {
    c.SwaggerDoc("v1", new Info { 
        Title = "API", Version = "v1" 
    });
});

Настройка запуска

app.UseSwagger(c => {
    c.RouteTemplate = "{documentName}/configuration.json";
});

app.UseSwaggerUI(c =>
{
     c.SwaggerEndpoint("/v1/configuration.json", "API");
     c.RoutePrefix = "v1/docs";
})

контроллер

[Route("v1/[controller]")]
[ApiController]
public class SomeController : ControllerBase {}

Все идет нормально...

Работает как шарм. Однако мое обновление до последней [Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer][2] не

Я следовал как за образцами, так и за документацией, но я не могу показать свои операции... Что мне здесь не хватает?

Запуск ConfigureServices

services
    .AddMvcCore()
    //.AddApiExplorer()
    .AddVersionedApiExplorer( o => o.GroupNameFormat = "'v'VVV" );

services.AddApiVersioning(o => o.ReportApiVersions = true);

services.AddSwaggerGen(c => {
//    c.SwaggerDoc("v1", new Info { 
//        Title = "API", Version = "v1" 
//    });

      foreach (var description in provider.ApiVersionDescriptions)
      {
          c.SwaggerDoc(
              description.GroupName,
              new Info()
              {
                  Title = $"API",
                  Version = description.ApiVersion.ToString()
              });
      }
      c.OperationFilter<SwaggerDefaultValues>();
});

* SwaggerDefaultValues.cs

Настройка запуска

app.UseSwagger(c => {
    c.RouteTemplate = "{documentName}/configuration.json";
});

app.UseSwaggerUI(c =>
{
     c.SwaggerEndpoint("/v1/configuration.json", "API");
     c.RoutePrefix = "v1/docs";

     foreach (var description in apiProvider.ApiVersionDescriptions)
     {
         c.SwaggerEndpoint($"/{description.GroupName}/configuration.json", description.GroupName.ToUpperInvariant());
     }
})

контроллер

//[Route("v1/[controller]")]
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class SomeController : ControllerBase {}

1 ответ

Это, вероятно, потому что вы закомментировали .AddApiExplorer() и у вас нет звонка .AddMvc(), Призыв к .AddMvcCore() не звонит .AddApiExplorer() и не делает .AddVersionedApiExplorer() (который будет изменен в v3.0, чтобы избежать такого рода проблем). Призыв к .AddMvc() как показано в примерах .AddApiExplorer() косвенно. Это, вероятно, причина, и вам просто нужно принести .AddApiExplorer() обратно в складку.

Кроме того, есть ли конкретная причина, по которой вы настраиваете:

c.SwaggerEndpoint("/v1/configuration.json", "API");
c.RoutePrefix = "v1/docs";

Не уверен, влияет ли это на это, но в этом нет необходимости.

Вы установили точки останова внутри:

services.AddSwaggerGen(c => { … })

А также

app.UseSwaggerUI(c => { … })

В AddSwaggerGen, вы должны увидеть хотя бы одно описание API. В UseSwaggerUI надо посмотреть хотя бы 1.0, Не понятно, сколько у вас версий на данный момент.

Другие вопросы по тегам