Не поддерживается Swagger 2.0: несколько операций с путем 'api / Client' и методом 'GET'

В моем веб-api у меня есть 2 метода получения, один для получения всех клиентов и один для получения клиента по идентификатору

  [HttpGet]
    public async Task<IHttpActionResult> GetClients()
    {
        var telemetry = new TelemetryClient();
        try
        {
            var roles = await CosmosStoreHolder.Instance.CosmosStoreClient.Query().ToListAsync();
            return Ok(roles);
        }
        catch (System.Exception ex)
        {
            string guid = Guid.NewGuid().ToString();
            var dt = new Dictionary<string, string>
            {
                { "Error Lulo: ", guid }
            };

            telemetry.TrackException(ex, dt);
            return BadRequest("Error Lulo: " + guid);
        }
    }

    [HttpGet]
    public async Task<IHttpActionResult> GetClient(string clientId)
    {     
        var telemetry = new TelemetryClient();
        try
        {
            var clientStore = CosmosStoreHolder.Instance.CosmosStoreClient;
            var client = await clientStore.Query().FirstOrDefaultAsync(x => x.Id == clientId);
            if (client == null)
            {
                return NotFound();
            }
            return Ok(client);
        }
        catch (System.Exception ex)
        {
            telemetry.TrackException(ex);
            return BadRequest("Unknown error");
        }
    }

Я только что установил swashbucckle и настроил в соответствии с этим:

https://www.c-sharpcorner.com/article/implementing-swagger-in-web-api/

Однако я получаю сообщение об ошибке ниже

500 : {"Message":"An error has occurred.","ExceptionMessage":"Not supported by Swagger 2.0: Multiple operations with path 'api/Client' and method 'GET'. See the config setting - \"ResolveConflictingActions\" for a potential workaround","ExceptionType":"System.NotSupportedException","StackTrace":" at Swashbuckle.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver(IEnumerable1 apiDescriptions) \ r \ n в Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem (группа IEnumerable1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping2) \ r \ n в System.Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (IEnumerable1 source, Func2 keySelector, в Func1 source, Func2 keySelector) Swashbuckle.Swagger.SwaggerGenerator.GetSwagger (String rootUrl, String apiVersion) \ r \ n в Swashbuckle.Application.SwaggerDocsHandler.SendAsync (запрос HttpRequestMessage, CancellationToken cancellationTokessage.HRequestMessage request. , CancellationToken cancellationToken) \ r \ n в System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync (запрос HttpRequestMessage, CancellationToken cancellationToken) \ r \ n в System.Net.Http.DelegatingHandclerSendageToken (запрос cancellationMessage), cancellationMessage (запрос Http. \ n на System.Web.Http.HttpServer.d__0.MoveNext () "} https://webapi-app.azurewebsites.net/swagger/do `cs / v1


person Luis Valencia    schedule 09.10.2019    source источник
comment
Не думаю, что вы правильно определили проблему. У вас есть 2 разные функции с / подобными / именами (GetClients против GetClient). У Swagger не должно быть с этим проблем.   -  person Neil    schedule 09.10.2019
comment
У вас есть вторая функция с именем GetClient с другим набором параметров?   -  person Neil    schedule 09.10.2019
comment
Спасибо, @Neil, я проверил, и у меня нет дублированных конечных точек, это действительно редко   -  person Luis Valencia    schedule 09.10.2019
comment
Проверьте изменение clientId на int GetClient(int clientId) просто проверьте, отличается ли путь ...   -  person Helder Sepulveda    schedule 09.10.2019
comment
установите атрибут поверх обоих методов [Route (api / GetClients] и [Route (api / GetClient)]   -  person JohnChris    schedule 09.10.2019
comment
проверьте это, та же проблема stackoverflow.com/questions/39412998/ исправление заключалось в том, чтобы вручную указывать одно за другим имя для чванства   -  person SilentTremor    schedule 09.10.2019


Ответы (1)


Ваша проблема вызвана строковым параметром, строки по умолчанию допускают значение NULL.
Маршруты ваших действий:

  • GetClients()
  • GetClient(string clientId)

будет то же самое.

Если это было целое число, маршрут будет выглядеть так:
/api/Controller/{clientId}
и не будет конфликтовать с GetClients.

Изменение типа данных может быть недопустимым вариантом, вы можете быть вынуждены использовать маршруты:


Глядя на некоторые из моих примеров, я обнаружил, что этот контроллер использует маршруты и несколько Gets:

http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=Location#/

Вы можете видеть, что у меня есть несколько get под одним и тем же контроллером, но они имеют немного разные действия:

[RoutePrefix("Location")]
public class LocationController : ApiController
{
    [Route("Get1")]
    public GeolocateResponse Get1([FromUri] GeolocateResponse x)
    {
        return x;
    }

    [Route("Get2")]
    public Location Get2([FromUri] Location x)
    {
        return x;
    }
person Helder Sepulveda    schedule 09.10.2019