我在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。<> 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
在第二个控制器中,我添加了以下两种方法。
string Get(string username, string password);
string Get(string credential);
如果我评论其中一种方法。然后它工作正常。
任何想法如何解决它?
答案 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)
上述两种方法有两种选择:
将两个方法合并为一个具有三个参数的方法 - 每个方法都在查询字符串中
有单独的路线网址,例如 - api/controller/byusername
和api/controller/bycredentials
答案 2 :(得分:1)
我了解这是一个旧线程。我会稍微偏离OP发行。但是我最近遇到了这个问题,并花了很长时间试图弄清正在发生什么(此问题在Google的顶部)。可能会帮助您度过数小时的痛苦。
我的控制器都扩展了基本控制器,而我愚蠢地具有公共功能,而不是受保护的功能。所以大张旗鼓地把公共职能当做重复项目。
希望这可以帮助其他人避免浪费不必要的时间。
答案 3 :(得分:0)
在使用属性路由的情况下也会出现此问题。
如果属性路由与可路由路由冲突,则会出现“多个操作”错误。
示例:
[HttpGet]
[SwaggerOperation("GetByUsername")]
[Route("[path]/User")]
public IHttpActionResult GetUser(string username)
{
}
答案 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
。