Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.Net 6 Web Api Swagger Versioning problem

As the title suggests, i have a .net 6 web api that I'm trying to add versioning to but swagger (swashbuckle) does not seem to understand whats going on.

Program.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Versioning;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddApiVersioning(setup =>
{
    setup.DefaultApiVersion = new ApiVersion(1, 0);
    setup.AssumeDefaultVersionWhenUnspecified = true;
    setup.ReportApiVersions = true;
});

ConfigureServices(builder.Services);

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint($"/swagger/v1/swagger.json", $"v1");
    c.SwaggerEndpoint($"/swagger/v2/swagger.json", $"v2");
});

app.Run();

void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore();
        
    services.AddApiVersioning(options =>
    {
        options.ReportApiVersions = true;
        options.AssumeDefaultVersionWhenUnspecified = false;
        options.ApiVersionReader = new UrlSegmentApiVersionReader();
    });
    services.AddSwaggerGen();
}

I have annotated my controllers like so:

[ApiVersion("1.0")]
[Route("api/v1/[controller]")]
[ApiController]
public class MessageController : ControllerBase

[ApiVersion("2.0")]
[Route("api/v2/[controller]")]
[ApiController]
public class MessageController : ControllerBase

The swagger document that is generated looks like this:

enter image description here

And if i select v2 from the drop down, I get this:

enter image description here

Nuget packages and versions installed are:

enter image description here

Can anyone tell me where I'm going wrong.

like image 886
JsonStatham Avatar asked Sep 12 '25 08:09

JsonStatham


1 Answers

Besides passing the configuration here:

services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API - V1", Version = "v1" });
     c.SwaggerDoc("v2", new OpenApiInfo { Title = "My API - V2", Version = "v2" });
});

According to the docs you have to specify the GroupName of the controller:

[ApiVersion("2.0")]
[Route("api/v2/[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = "v2")]
public class MessageController : ControllerBase

Also, the docs show ways to customize and add conventions.

like image 84
Rafael P. Miranda Avatar answered Sep 14 '25 00:09

Rafael P. Miranda