Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# .net core swagger trying to use Multiple API Versions, but all end-points are in all documents

We are trying to separate our API versions into different Swagger documents. We have configured everything as described in https://github.com/domaindrivendev/Swashbuckle.AspNetCore#generate-multiple-swagger-documents.

So we have configured two versions like this:

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" });
})

Also we have configured to see them in swagger ui. like this:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API - V1");
    c.SwaggerEndpoint("/swagger/v2/swagger.json", "My API - V2");
});

To set the end-points in the right version we use the following convention:

public class ApiExplorerGroupPerVersionConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        var controllerNamespace = controller.ControllerType.Namespace; // e.g. "Controllers.V1"
        var apiVersion = controllerNamespace.Split('.').Last().ToLower();

        controller.ApiExplorer.GroupName = apiVersion;
    }
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(c =>
        c.Conventions.Add(new ApiExplorerGroupPerVersionConvention())
    );
}

Now we see the two documents in the UI and we can go to the json files. So that works. But the all the end-points are in both the documents. We expected that we see the v1 end-points in v1 and the v2 end-points in v2. But that is not the case. If we debug the convention then we see that it set the groupname correctly. If we don't set the group name we don't see the end-points at all.

So it all seems to work, except that it is not separated. Did we miss something?

like image 896
C. Molendijk Avatar asked Nov 13 '19 09:11

C. Molendijk


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

Is C language easy?

Compared to other languages—like Java, PHP, or C#—C is a relatively simple language to learn for anyone just starting to learn computer programming because of its limited number of keywords.

Is C programming hard?

C is more difficult to learn than JavaScript, but it's a valuable skill to have because most programming languages are actually implemented in C. This is because C is a “machine-level” language. So learning it will teach you how a computer works and will actually make learning new languages in the future easier.


2 Answers

This is how I config swagger with multi version

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new Info
    {
        Version = "v1",
        Title = "Awesome CMS Core API V1",
        Contact = new Contact { Name = "Tony Hudson", Email = "", Url = "https://github.com/ngohungphuc" }
    });

    c.SwaggerDoc("v2", new Info
    {
        Version = "v2",
        Title = "Awesome CMS Core API V2",
        Contact = new Contact { Name = "Tony Hudson", Email = "", Url = "https://github.com/ngohungphuc" }
    });

    c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});


app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint($"/swagger/v1/swagger.json", "Awesome CMS Core API V1");
    c.SwaggerEndpoint($"/swagger/v2/swagger.json", "Awesome CMS Core API V2");
});

And in my controller I need to config like this

[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("api/v{version:apiVersion}/Account/")]
like image 168
Tony Ngo Avatar answered Sep 16 '22 13:09

Tony Ngo


The problem was that I had the following line in my swagger config:

services.AddSwaggerGen(c =>
{
...
c.DocInclusionPredicate((_, api) => !string.IsNullOrWhiteSpace(api.GroupName));
...
});

The doc inclusion prediction was always giving back true. That why it added all the end-points to all the docs. We don't need the doc inclusion prediction as we already add the and-points to to correct group by the ApiExplorerGroupPerVersionConvention

like image 45
C. Molendijk Avatar answered Sep 16 '22 13:09

C. Molendijk