NSwag + System.InvalidOperationException: The method 'get' on path '/Site' is registered multiple times

Viewed 664

I just setup a new .NET Core 3.1 project, but I am having some issues when trying to use NSwag.AspNetCore, it has something to do with my controller but I can't figure it out. Here is my Site controller:

[Route("[controller]")]
[ApiController]
public class SiteController : BaseController
{
    private readonly ISiteService _siteService;
    public SiteController(ISiteService siteService, ILogger<SiteController> logger) : base(logger)
    {
        _siteService = siteService;
    }

    [HttpGet]
    public IActionResult GetAllSites() => (ReadService(() => _siteService.Sites()));

    [HttpGet("domainName/{domainName}")]
    public IActionResult GetByDomainName(string domainName) => (ReadService(() => _siteService.Site(domainName)));

    [HttpGet("status")]
    public Task<IActionResult> GetStatusAsync() => (ReadServiceAsync(async () => await _siteService.GetApiStatusAsync()));

    [HttpGet("lookupdata")]
    public Task<IActionResult> GetLookupDataAsync() => (ReadServiceAsync(async () => await _siteService.GetLookupDataAsync()));

}

I am hitting /Site and it works fine via postman, it calls GetAllSites().

BUT for some reason I am getting the following error when trying to generate the swagger json (hit the SwaggerUI):

System.InvalidOperationException: The method 'get' on path '/Site' is registered multiple times.
    at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.AddOperationDescriptionsToDocument(OpenApiDocument document, Type controllerType, List`1 operations, OpenApiDocumentGenerator swaggerGenerator, OpenApiSchemaResolver schemaResolver)
    at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateForControllers(OpenApiDocument document, IGrouping`2[] apiGroups, OpenApiSchemaResolver schemaResolver)
    at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateAsync(ApiDescriptionGroupCollection apiDescriptionGroups)
    at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateAsync(Object serviceProvider)
    at NSwag.AspNetCore.OpenApiDocumentProvider.GenerateAsync(String documentName)
    at NSwag.AspNetCore.Middlewares.OpenApiDocumentMiddleware.GenerateDocumentAsync(HttpContext context)
    at NSwag.AspNetCore.Middlewares.OpenApiDocumentMiddleware.GetDocumentAsync(HttpContext context)
    at NSwag.AspNetCore.Middlewares.OpenApiDocumentMiddleware.Invoke(HttpContext context)

I am not sure what I could be doing wrong here everything seems to be setup properly.

For what it's worth, I am also including the custom BaseController class if there is something wrong there:

[ApiController]
public abstract class BaseController : ControllerBase
{
    private ILogger _logger;
    protected BaseController(ILogger logger)
    {
        _logger = logger;
    }
}

If I were to decorate GetAllSites with:

[HttpGet("AllSites")]

It will work, but I don't want to do that, I want to be able to get all sites when I hit /site

1 Answers

For each action you can specify the routes as follow:

[HttpGet]
[Route("{id:min(1)}/GetItems1", Name = "GetHotelFacilities")]
public async Task getItems1(){}

[HttpGet]
[Route("{id:min(1)}/GetItems2", Name = "GetHotelFacilities")]
public async Task getItems2(){}
Related