Не поддерживается 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
У вас есть два варианта вышеупомянутых двух методов:
-
Объедините два метода в один с тремя параметрами - каждый будет в строке запроса
-
Иметь отдельные 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.