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

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

Произошла ошибка. "," ExceptionMessage ":" Не поддерживается Swagger 2.0: множественные операции с путем 'api/Credential' и методом 'GET'. См. Параметр конфигурации -\"ResolveConflictingActions \" для возможного обходного пути "," ExceptionType ":" System.NotSupportedException "," StackTrace ":" в Swashbuckle.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver(1 apiDescriptions)\r\n at Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable 1 apiDescription, schemaRegistry schemaRegistry)\r\n в Swashbuckle.Swagger.SwaggerGenerator. <> C__DisplayClass7.b__4 (2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable IGrouping 2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable. Источник в системе. 2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 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. 1 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/v1

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

 string Get(string username, string password);

 string Get(string credential);

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

Есть идеи как это исправить?

Ответ 1

В файле 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(){....}

Ответ 2

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

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

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

Ответ 3

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

Значением по умолчанию является [Route("api/[controller]")]

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

Ответ 4

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

Если маршрут атрибута конфликтует с маршрутизируемым маршрутом, у вас будет ошибка "нескольких операций".

Пример:

[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

Ответ 5

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

Ответ 6

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

В моем контроллере есть несколько элементов 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() {...}

Ответ 7

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

Ответ 8

Как насчет чтение документов? Он говорит, что Swashbuckle не поддерживает такие подписи методов. Однако вы можете создать фильтр операций для установки идентификатора или использовать SwaggerOperationAttribute, как указано в этом Q & A.