Reputation: 868
I've set up two Swagger documents versions/descriptions:
builder.Services.AddSwaggerGen(setupAction =>
{
setupAction.SwaggerGeneratorOptions.SwaggerDocs.Add("v1", new OpenApiInfo()
{
Version = "v1",
Title = "MY API version 1",
Description = "This is my API in version1",
});
setupAction.SwaggerGeneratorOptions.SwaggerDocs.Add("v2", new OpenApiInfo()
{
Version = "v2",
Title = "MY API version 2",
Description = "This is my API in version2",
});
I can see generated documentation under:
https://localhost:7169/swagger/v1/swagger.json
{
"openapi": "3.0.1",
"info": {
"title": "MY API version 1",
"description": "This is my API in version1",
"version": "v1"
},
"paths": {
https://localhost:7169/swagger/v2/swagger.json
{
"openapi": "3.0.1",
"info": {
"title": "MY API version 2",
"description": "This is my API in version2",
"version": "v2"
},
"paths": {
But I cannot find out how to set up default version when SwaggerUI starts to version v2 and why there is only version v1 available in "Select a definition" dropdown:
Upvotes: 2
Views: 2859
Reputation: 36725
Here is a whole working demo you could follow if any missing:
1.Configure SwaggerOptions
to register all API versions:
public class ConfigureSwaggerOptions
: IConfigureNamedOptions<SwaggerGenOptions>
{
private readonly IApiVersionDescriptionProvider _provider;
public ConfigureSwaggerOptions(
IApiVersionDescriptionProvider provider)
{
_provider = provider;
}
/// <summary>
/// Configure each API discovered for Swagger Documentation
/// </summary>
/// <param name="options"></param>
public void Configure(SwaggerGenOptions options)
{
// add swagger document for every API version discovered
foreach (var description in _provider.ApiVersionDescriptions)
{
options.SwaggerDoc(
description.GroupName,
CreateVersionInfo(description));
}
}
/// <summary>
/// Configure Swagger Options. Inherited from the Interface
/// </summary>
/// <param name="name"></param>
/// <param name="options"></param>
public void Configure(string name, SwaggerGenOptions options)
{
Configure(options);
}
/// <summary>
/// Create information about the version of the API
/// </summary>
/// <param name="description"></param>
/// <returns>Information about the API</returns>
private OpenApiInfo CreateVersionInfo(
ApiVersionDescription desc)
{
var info = new OpenApiInfo()
{
Title = ".NET Core (.NET 6) Web API",
Version = desc.ApiVersion.ToString()
};
if (desc.IsDeprecated)
{
info.Description += " This API version has been deprecated. Please use one of the new APIs available from the explorer.";
}
return info;
}
}
2.Program.cs:
Note: Be sure install Microsoft.AspNetCore.Mvc.Versioning
and Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer
.
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddApiVersioning(o => {
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
});
builder.Services.AddVersionedApiExplorer(setup =>
{
setup.GroupNameFormat = "'v'VVV";
setup.SubstituteApiVersionInUrl = true;
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.ConfigureOptions<ConfigureSwaggerOptions>(); // register the options here....
var app = builder.Build();
var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
//app.UseSwaggerUI();
app.UseSwaggerUI(options =>
{
foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions.Reverse())
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",
description.GroupName.ToUpperInvariant());
}
});
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
3.Controller:
namespace SwaggerProj.Controllers
{
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class WeatherForecastController : ControllerBase
{
[HttpGet(Name = "GetWeatherForecast")]
public IActionResult Get()
{
return Ok("v1");
}
}
}
namespace SwaggerProj.Controllers.v2
{
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class WeatherForecastController : ControllerBase
{
[HttpGet(Name = "GetWeatherForecast")]
public IActionResult Get()
{
return Ok("v2");
}
}
}
4.Result:
Upvotes: 4