问题
I have integrated swagger in WebApi 2 application. It works fine when application has single controller. When I added second controller in the application. I got following error :
An error has occurred.","ExceptionMessage":"Not supported by Swagger 2.0: Multiple operations with path 'api/Credential' and method 'GET'. See the config setting - \"ResolveConflictingActions\" for a potential workaround","ExceptionType":"System.NotSupportedException","StackTrace":" at Swashbuckle.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver(IEnumerable
1 apiDescriptions)\r\n at Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable
1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.b__4(IGrouping2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1 source, Func2 keySelector, Func
2 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/v1
In the second controller I have added following two methods.
string Get(string username, string password);
string Get(string credential);
If I comment one of the method. Then it works fine.
Any Idea how to fix it?
回答1:
In the file AppStart/SwaggerConfig.cs
First one, you must import Linq
using System.Linq;
And add in the same file, this line
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
just inside of:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{ ...
One consideration:
In your controllers, you must use the 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:
You have two options for the above two methods:
Combine two methods into single one with three parameters - each one will be in the query string
Have separate route urls like -
api/controller/byusername
andapi/controller/bycredentials
回答3:
You can change the route on your controller.
The default value is [Route("api/[controller]")]
You can change to [Route("api/[controller]/[action]")]
回答4:
The problem can also occur in a situation where you use attribute routing.
If the attribute route conflicts with a routingtable route you will have the 'multiple operations' error.
Example:
[HttpGet]
[SwaggerOperation("GetByUsername")]
[Route("[path]/User")]
public IHttpActionResult GetUser(string username)
{
}
more info on attribute routing: https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
回答5:
Add seperate route on your conflicting methods.
Such as [Route("GetByType")]
above of one and [Route("GetById")]
on another
回答6:
An answer I haven't seen: I bungled up usings.
My controller has some MVC items (List items) and thus has a link:
using System.Web.Http;
using System.Web.Mvc;
Because of this, somehow, it got registered twice (I assume). Problem was fixed by using the full qualification for RoutePrefix/Route/HttpGet and others.
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:
Add route attribute for the method [Route("ApiAnotherFunction")]
and [HttpGet]
.
来源:https://stackoverflow.com/questions/39601890/not-supported-by-swagger-2-0-multiple-operations-with-path