Swashbuckle / Swagger + ASP.Net Core:“无法加载API定义”

问题描述 投票:27回答:11

我开发了一个ASP.NET Core 2应用程序,并包含Swagger。一切工作正常,直到我介绍了一种没有明确定义HTTP操作的方法:

public class ErrorController : Controller
{
    [Route("/error")]
    public IActionResult Index()
    {
        return StatusCode(500, new Error("Internal error."));
    }
}

当我使用此方法启动应用程序时,出现以下消息:

无法加载API定义。

错误提取错误内部服务器错误/swagger/v1/swagger.json

我明确设置例如[HttpGet]错误消失。问题是,我需要为所有可能的HTTP操作触发此方法。当然,我可以明确指定所有操作,但是我认为Swagger应该能够正确处理此操作。

为什么Swagger会这样表现?

我可以使用任何配置吗?

c# asp.net-core swagger swashbuckle
11个回答
10
投票

选项ResolveConflictingActions应该适用于这种情况...

这里是实际错误:

System.NotSupportedException: Ambiguous HTTP method for action

来自:https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerGen/Generator/SwaggerGenerator.cs#L90

我认为这是一个错误,如果您真的很感兴趣,应该将其报告给项目


0
投票

我的错误原因是相同的URL名称,

 [HttpGet("get/LeaveCommand/{id}")]

我使用相同的网址,大摇大摆无法获取它们

 [HttpGet("get/LeaveCommand/{id}")]

0
投票

除了此github问题中的Helder Sepulvedas回答和'Monte-Christos'回答-Actions require unique method/path combination for Swagger

我找到了在ASP.NET中配置ResolveConflictingActions的地方核心应用。在您的安装程序类中,将此添加到ConfigureServices()方法:

services.AddSwaggerGen(c => 
  { 
    other configs...;
    c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
  });

这为我完成了把戏!


22
投票

为每个Action方法添加Httpxxx([HttpGet][HttpPost],...)属性,或[ApiExplorerSettings(IgnoreApi = true)]


7
投票

我不知道这个问题是否已经解决,但是您可以通过以下方法装饰方法之一:

[ApiExplorerSettings(IgnoreApi = true)]

这将确保所讨论的方法被Swagger忽略。


6
投票

简单来说,您可以在Output窗口中查看日志。在我的情况下可以看到实际的错误,我错过了在方法之上添加HTTP操作的信息

enter image description here


5
投票

另一个可能的问题是,端点需要从域根目录完成。

我有:

app.UseSwaggerUI(c =>
{
     c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});

我必须使用:

 app.UseSwaggerUI(c=>
{
     c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");

});

4
投票

在ASP.NET Core中,如果存在控制器端点,例如:

[Route("images")]
[HttpGet("{id}")]

这也可能因获取失败而失败。解决的办法是有类似

的内容
[HttpGet("images/{id}")]

HttpPost也是如此。


3
投票

如果某些公共方法不是控制器中的操作,Swagger也会抛出相同的异常。解决方法是使它们全部为protectedprivate或如上所述添加属性[ApiExplorerSettings(IgnoreApi = true)]


0
投票

我在要删除的未使用的类上得到TypeLoadException。我的解决方法是删除bin / obj / Debug文件夹中的内容。干净的解决方案+重建解决方案无法解决我的问题。


0
投票

我也收到此错误,因为我创建了一个具有[Route("api/[controller]")]的控制器。放置后,错误消失了。

© www.soinside.com 2019 - 2024. All rights reserved.