0

I have problem when run swagger with this methods. Can you help me?

[HttpPost]
        [ApiVersion("1.0")]
         public IActionResult SetEmployeeV1()
        { 
          v1 ...
        }
        [HttpPost]
        [ApiVersion("2.0")]
        public IActionResult SetEmployeeV2()
        {
           v2 ...             
        }

3 Answers3

1

I create 2 controllers to represent different versions.

This is version one.

using Microsoft.AspNetCore.Mvc;

namespace WebApiNet6.Controllers.V1
{
    //[Route("api/[controller]")]
    [ApiController]
    [Route("api/v{version:apiVersion}/Data")]
    [ApiVersion("1.0")]
    public class DataController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        [HttpGet]
        public IEnumerable<string> Get()
        {
            return Summaries.Where(x => x.StartsWith("C"));
        }
    }
}

This is version 2:

namespace WebApiNet6.Controllers.V2
{
    //[Route("api/[controller]")]
    [ApiController]
    [Route("api/v{version:apiVersion}/Data")]
    [ApiVersion("2.0")]
    public class DataController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        [HttpGet]
        public IEnumerable<string> Get()
        {
            return Summaries.Where(x => x.StartsWith("S"));
        }
    }
}

enter image description here

Now I can call them successfully in a browser, but I can't let the api displayed in swagger. So I need to modify Program.cs(Startup.cs in .net 5)

using Microsoft.OpenApi.Models;

builder.Services.AddApiVersioning(setup =>
{
    setup.DefaultApiVersion = new ApiVersion(1, 0);
    setup.AssumeDefaultVersionWhenUnspecified = true;
    setup.ReportApiVersions = true;
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => {
    c.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "this is V1"
    });
    c.SwaggerDoc("v2", new OpenApiInfo
    {
        Version = "v2",
        Title = "this is V2"
    });

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

app.UseSwagger();
app.UseSwaggerUI();

enter image description here

Tiny Wang
  • 10,423
  • 1
  • 11
  • 29
0

I was getting the same error SwaggerGeneratorException: Conflicting method/path combination "PATCH api/ Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround. You can get the actual error by going to your Swagger link like below.

https://localhost:{yourport}/swagger/v1/swagger.json

This happens when you have the same route for multiple APIs. For example:-

    /// <summary>
    /// Do something 1.
    /// </summary>
    /// <returns></returns>
    [HttpPatch]
    public string Do1() => Dosomething1();

    /// <summary>
    /// Do something 2.
    /// </summary>
    /// <returns></returns>
    [HttpPatch]
    public string Do2() => Dosomething2();

All you have to do is to change that to specific routes as [HttpPatch("Do1")] and [HttpPatch("Do2")].

    /// <summary>
    /// Do something 1.
    /// </summary>
    /// <returns></returns>
    [HttpPatch("Do1")]
    public string Do1() => Dosomething1();

    /// <summary>
    /// Do something 2.
    /// </summary>
    /// <returns></returns>
    [HttpPatch("Do2")]
    public string Get2() => Dosomething2();
Sibeesh Venu
  • 18,755
  • 12
  • 103
  • 140
0

One of the solution would be For .NET 6+, configure the Swagger Generation in Program.cs

    builder.Services.AddSwaggerGen(c => {
                  c.IgnoreObsoleteProperties = true;
                  c.OperationProcessors.Add(new IncludeControllersInSwagger());
             });
Thriveni
  • 742
  • 9
  • 11