Версионный API с Swagger не обнаруживает операции API - PullRequest
0 голосов
/ 05 июля 2018

Я реализовал 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] не

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

Запуск Настройка служб

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 Ответ

0 голосов
/ 10 июля 2018

Вероятно, это потому, что вы закомментировали .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. Не ясно, сколько у вас версий на данный момент.

...