Swagger 2.0不支持:带路径的多个操作

use*_*837 25 c# asp.net-web-api swagger asp.net-web-api-routing swashbuckle

我在WebApi 2应用程序中集成了swagger.应用程序有单个控制器时,它工作正常.当我在应用程序中添加第二个控制器时.我收到以下错误:

发生错误.","ExceptionMessage":"Swagger 2.0不支持:路径'api/Credential'和方法'GET'的多个操作.请参阅配置设置 - \"ResolveConflictingActions \"以获取潜在的解决方法","ExceptionType":"System.NotSupportedException","StackTrace":"at Swashbuckle.Swagger.SwaggerGeneratorOptions.DefaultConflictingActionsResolver(IEnumerable 1 apiDescriptions)\r\n at Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable1 apiDescriptions,SchemaRegistry schemaRegistry)\ r \在Swashbuckle.Swagger.SwaggerGenerator.<> c__DisplayClass7.b__4(IGrouping 2 group)\r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable1 source,Func 2 keySelector, Func2 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.d__0.MoveNext()"} http:// localhost:50950/swagger/docs/v1

在第二个控制器中,我添加了以下两种方法.

 string Get(string username, string password);

 string Get(string credential);
Run Code Online (Sandbox Code Playgroud)

如果我评论其中一种方法.然后它工作正常.

任何想法如何解决它?

MrM*_*ins 33

AppStart/SwaggerConfig.cs文件中

首先,你必须导入 Linq

using System.Linq;
Run Code Online (Sandbox Code Playgroud)

并在同一个文件中添加此行

c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
Run Code Online (Sandbox Code Playgroud)

就在里面:

GlobalConfiguration.Configuration 
                .EnableSwagger(c =>
                    { ...
Run Code Online (Sandbox Code Playgroud)

一个考虑因素:在您的控制器中,您必须使用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(){....}
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但重要的是要了解原因:如果有两条匹配的路线,则只会记录第一个路线。某些人可能更喜欢更改方法的路由名称。 (5认同)
  • 答案中应该有一个警告。我不鼓励人们使用这种方法来解决这个错误。我宁愿更改路线名称。 (4认同)

Sil*_*ohn 9

上述两种方法有两种选择:

  1. 将两个方法合并为一个具有三个参数的方法 - 每个方法都在查询字符串中

  2. 有单独的路线网址,如 - api/controller/byusernameapi/controller/bycredentials