Web Api - Swagger 文档错误 500。

14

当我访问swagger网址:http://localhost:28483/swagger/ui/index时,会出现以下错误:

500 : undefined http://localhost:28483/swagger/docs/v1

有任何想法吗?

更新: 在Firebug中看到了这个详细错误:

Not supported by Swagger 2.0: Multiple operations
 with path 'api/BimModel' and method 'GET'. See the config setting - \"ResolveConflictingActions\" for
 a potential workaround

你得到了什么错误? - cuongle
@CuongLe:这就是我在浏览器中得到的一切。 - Minh Nguyen
7个回答

11

Swagger可能会将两个操作视为一个操作(就像这个常见场景的情况)...

GET api/Products
GET api/Products/{id}

看起来你可以使用属性路由来解决这个问题,只需要在你的操作方法上方添加相应的属性即可,这样Swagger就能够单独识别它们了。

[Route("api/Products")]

[Route("api/Products/{id:guid}")]

9
您尝试在Swagger配置中启用此功能了吗?
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

2
虽然这可能解决错误,但其他操作将不会在Swagger中显示。 - Evan

1

在控制器中,有两个不同的GET操作,这是Swagger不允许的。 我建议每个控制器只有一个单独的GET操作,或者修改WebApiConfig中的路由


1
不幸的是,在ApiConfig中修改路由器并没有起到作用。仍然会出现“Swagger 2.0不支持:路径有多个操作...”的错误。看起来我必须为每个get方法创建新的控制器,或者是否有其他方法可以强制Swagger合作(例如使用某些属性)? - wolen

0
当我混合使用属性路由和默认路由时,遇到了相同的问题。当我删除默认路由时,问题消失了。缺点是,没有定义默认路由,我必须将属性路由添加到所有控制器中。
所以我从我的WebApiConfig中删除了以下内容:
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

我在我的控制器中添加了属性路由:

[Route("Session")] // Added this attribute
public async Task<IHttpActionResult> Get()
...    
[Route("Session/{id}")] // Added this attribute
public async Task<IHttpActionResult> Get(int id)

实际上,我在我的控制器上使用了[RoutePrefix("Session")],并在我的方法上使用了[Route("")],但结果应该是相同的。

0

我因为属性路由语句和方法签名之间的参数名称不匹配而出现了这个错误。

[HttpGet("{id}")]
public IActionResult Get(string deviceNumber){
...

将“{id}”更改为“{deviceNumber}”后,错误得以解决。


0
在我的情况下,错误是由于重复的http属性导致的。
[HttpPost("PostCustomer")]
public async Task<IActionResult> PostCustomer([FromBody] Customer cust)

我们正在创建一个新版本的终端,所以我复制并粘贴了旧的方法,改变了函数名字,却忘记了改变属性的名字。
[HttpPost("PostCustomer")] // Duplicate attribute maps to above method
public async Task<IActionResult> CreateNewCustomer([FromBody] Customer2 cust)

一旦第二个属性被重命名为新方法,Swagger就恢复正常了。

-1
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

3
嘿,欢迎来到Stackoverflow!请使用英语,因为几乎没有人能理解您的答案。这个网站的理念是一个人提问,另一个人回答,并且针对问题的解决方案被记录下来,供所有遇到相同问题的人参考。因此,如果只有一小部分人能理解您的答案,那么这有点浪费;) - Markus W Mahlberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接