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

Я интегрировал чванство в приложение WebApi 2. Он отлично работает, когда приложение имеет один контроллер. Когда я добавил в приложение второй контроллер. У меня следующая ошибка:

Произошла ошибка. "," ExceptionMessage ":" Не поддерживается Swagger 2.0: несколько операций с путем 'api / Credential' и методом 'GET'. См. Параметр конфигурации - \ "ResolveConflictingActions \" для потенциального обходного пути "," ExceptionType ":" System.NotSupportedException "," StackTrace ":" в Swashbuckle.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver (IEnumegistryRegistry_1) в Swashbuckle.Swagger.SwaggerGenerator. ‹> c__DisplayClass7.b__4 (источник IGrouping2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable1, Func2 keySelector, Func2 elementSelector, IEqualityComparer1 comparer)\r\n at Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl, String apiVersion)\r\n at Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Web.Http.Cors.CorsMessageHandler.<SendAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.HttpServer.d__0.MoveNext ()"} http://localhost:50950/swagger/docs=

Во втором контроллере я добавил следующие два метода.

 string Get(string username, string password);

 string Get(string credential);

Если я прокомментирую один из способов. Тогда нормально работает.

Любая идея, как это исправить?


person user2266837    schedule 20.09.2016    source источник
comment
stackoverflow.com/a/42976546/1335146   -  person Can Ürek    schedule 23.03.2017
comment
Вы можете захотеть настроить Swashbuckle. Затем вам нужно адаптировать метод фильтрации для достижения того, что вам нужно.   -  person Elisabeth    schedule 31.05.2017


Ответы (9)


В файле AppStart / SwaggerConfig.cs

Во-первых, вы должны импортировать Linq

using System.Linq;

И добавьте в тот же файл эту строчку

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

только внутри:

GlobalConfiguration.Configuration 
                .EnableSwagger(c =>
                    { ...

Одно соображение: в ваших контроллерах вы должны использовать Http methods:

[HttpGet]
[Route("something")]
public List<model> something(){....}

[HttpGet]
[Route("something2")]
public List<model2> something2(){....}

[HttpPost]
[Route("mypost1")]
public List<model> mypost1(){....}

[HttpPost]
[Route("mypost2")]
public List<model2> mypost2(){....}
person MrMins    schedule 16.03.2018
comment
Это работает, но важно понимать, почему: если есть два совпадающих маршрута, будет задокументирован только 1-й. Некоторые могут предпочесть изменение имени маршрута метода. - person RandomUs1r; 22.03.2018
comment
В ответе должна быть оговорка. Я бы отговорил людей использовать этот метод для решения этой ошибки. Я бы предпочел изменить названия маршрутов. - person Kishan Vaishnav; 30.05.2019
comment
@KishanVaishnav, этот комментарий не добавляет ничего хорошего к вопросу. Вопрос ясен, и ответ правильный, связанный с вопросом. Вопрос не в том, это хороший способ. Прочтите вопрос еще раз и попробуйте добавить что-нибудь конструктивное. - person MrMins; 30.05.2019
comment
@MrMins Мои извинения. Не понимаю, почему вы написали об изменении SwaggerConfig. Разве недостаточно изменить маршрут? - person Kishan Vaishnav; 31.05.2019

У вас есть два варианта для двух вышеуказанных методов:

  1. Объедините два метода в один с тремя параметрами - каждый будет в строке запроса

  2. Имейте отдельные URL-адреса маршрутов, например - api/controller/byusername и api/controller/bycredentials

person Silly John    schedule 20.09.2016

Я так понимаю, это старая ветка. И я немного отклоняюсь от проблемы OP. Однако недавно у меня возникла эта проблема, и я долго пытался понять, что происходит (эта страница находится в верхней части Google по этой проблеме). и это может помочь другим пережить многочасовые боли.

все мои контроллеры расширили базовый контроллер, и у меня по глупости была общедоступная функция вместо защищенной функции. Так что чванство воспринимало публичную функцию как дубликат.

Надеюсь, это поможет другим тратить лишнее время.

person echrom    schedule 30.03.2020
comment
Это было для меня. Swagger бросал InvalidOperationException: The method 'get' on path '/Blog' is registered multiple times. У меня была базовая сущность с единственным public методом. GetUserId(). Изменение этого метода на protected решило проблему для меня. Из-за сообщения об ошибке я был уверен, что это как-то связано с моими множественными GET методами, один из которых принимает строковый параметр id, но нет - это был общедоступный метод в базовом классе. - person Dan Cook; 07.04.2021

Вы можете изменить маршрут на вашем контроллере.

Значение по умолчанию - [Route("api/[controller]")].

Вы можете изменить на [Route("api/[controller]/[action]")]

person Tiago Sampaio Corrêa    schedule 03.07.2019

Ответа, которого я не видел: я напортачил с использованием.

У моего контроллера есть некоторые элементы MVC (элементы списка) и, следовательно, есть ссылка:

using System.Web.Http;
using System.Web.Mvc;

Из-за этого как-то дважды регистрировался (я полагаю). Проблема была устранена путем использования полной квалификации для RoutePrefix / Route / HttpGet и других.

namespace MyNameSpace
{
    [System.Web.Http.RoutePrefix("api/Reports")]
    public class ReportsController
    {
        {...constructor...}

        [System.Web.Http.Route("Scans")]
        [System.Web.Http.HttpGet,ResponseType(typeof(List<ReportClass>))]
        public ascyn Task<HttpResponseMessage> GetScans() {...}
person WernerCD    schedule 16.08.2019

Проблема также может возникнуть в ситуации, когда вы используете маршрутизацию атрибутов.

Если маршрут атрибута конфликтует с маршрутом таблицы маршрутизации, вы получите ошибку «множественные операции».

Пример:

[HttpGet]
[SwaggerOperation("GetByUsername")]
[Route("[path]/User")]
public IHttpActionResult GetUser(string username)
{

}

дополнительная информация о маршрутизации атрибутов: https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

person FrankyHollywood    schedule 19.02.2018

Добавьте отдельный маршрут к вашим конфликтующим методам. Например, [Route("GetByType")] на одном и [Route("GetById")] на другом

person Abdus Salam Azad    schedule 24.01.2019

Извините, я ответил слишком поздно: решение проблемы состоит в том, чтобы удалить любой атрибут управления версиями маршрута на контроллере, если у вас более одного контроллера; По умолчанию чванство выбирает маршрут из WebApiConfig. Примечание. Вам не нужно указывать название действия или маршрут. Просто убедитесь, что никакие два действия не имеют одинакового имени или подписи; конечно, он никогда не компилируется.

person KenTechO    schedule 23.11.2020

Добавьте атрибут маршрута для метода [Route("ApiAnotherFunction")] и [HttpGet].

person Konstantin Danilkov    schedule 10.03.2017