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

时间:2016-09-20 19:01:06

标签: 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(IEnumerable 1 apiDescriptions,SchemaRegistry schemaRegistry)\ r \ n在Swashbuckle.Swagger.SwaggerGenerator。&lt;&gt; c__DisplayClass7.b__4(IGrouping 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. d__0.MoveNext() “} http://localhost:50950/swagger/docs/v1

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

 string Get(string username, string password);

 string Get(string credential);

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

任何想法如何解决它?

10 个答案:

答案 0 :(得分:23)

在文件 AppStart / SwaggerConfig.cs

首先,您必须导入listx = [a,b,c,d,e,f,g,h,i,j,k,l] listy = [1,2,3,4] listz = [1,2] list1 = [[0*5],[0*5]] def getListData(): for pos in range(len(listx)): for pos in range(listy): for pos in range(listz): list1 = input("Enter the number for position %s in pos %s in list %s" % (listz[pos], listy[pos], listx[pos]))

Linq

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

using System.Linq;

就在里面:

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

一个考虑因素: 在您的控制器中,您必须使用GlobalConfiguration.Configuration .EnableSwagger(c => { ...

Http methods

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:1)

我了解这是一个旧线程。我会稍微偏离OP发行。但是我最近遇到了这个问题,并花了很长时间试图弄清正在发生什么(此问题在Google的顶部)。可能会帮助您度过数小时的痛苦。

我的控制器都扩展了基本控制器,而我愚蠢地具有公共功能,而不是受保护的功能。所以大张旗鼓地把公共职能当做重复项目。

希望这可以帮助其他人避免浪费不必要的时间。

答案 3 :(得分:0)

在使用属性路由的情况下也会出现此问题。

如果属性路由与可路由路由冲突,则会出现“多个操作”错误。

示例:

[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

答案 4 :(得分:0)

在冲突的方法上添加单独的路由。 例如一个上方的[Route("GetByType")]和另一个上的[Route("GetById")]

答案 5 :(得分:0)

您可以在控制器上更改路由。

默认值为[Route("api/[controller]")]

您可以更改为[Route("api/[controller]/[action]")]

答案 6 :(得分:0)

一个我还没有看到的答案:我把使用的东西弄糟了。

我的控制器具有一些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 :(得分:0)

对不起,我回答太晚了:解决此问题的方法是,如果您有多个控制器,则删除控制器上的任何路由版本控制属性;摇摇车默认情况下会从WebApiConfig中选择路线。注意:您不需要提供操作名称或路由。只要确保没有两个动作具有相同的名称或签名即可;当然,它永远无法编译。

答案 8 :(得分:-1)

为方法[Route("ApiAnotherFunction")][HttpGet]添加路由属性。

答案 9 :(得分:-7)

reading the docs怎么样?它说Swashbuckle不支持这种方法签名。但是,您可以创建操作过滤器来设置ID,或使用Q&A中指出的SwaggerOperationAttribute