我开发了一个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会这样表现?
我可以使用任何配置吗?
选项ResolveConflictingActions应该适用于这种情况...
这里是实际错误:
System.NotSupportedException: Ambiguous HTTP method for action
我认为这是一个错误,如果您真的很感兴趣,应该将其报告给项目
我的错误原因是相同的URL名称,
[HttpGet("get/LeaveCommand/{id}")]
我使用相同的网址,大摇大摆无法获取它们
[HttpGet("get/LeaveCommand/{id}")]
除了此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());
});
这为我完成了把戏!
为每个Action方法添加Httpxxx([HttpGet]
,[HttpPost]
,...)属性,或[ApiExplorerSettings(IgnoreApi = true)]
我不知道这个问题是否已经解决,但是您可以通过以下方法装饰方法之一:
[ApiExplorerSettings(IgnoreApi = true)]
这将确保所讨论的方法被Swagger忽略。
另一个可能的问题是,端点需要从域根目录完成。
我有:
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});
我必须使用:
app.UseSwaggerUI(c=>
{
c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");
});
在ASP.NET Core中,如果存在控制器端点,例如:
[Route("images")]
[HttpGet("{id}")]
这也可能因获取失败而失败。解决的办法是有类似
的内容[HttpGet("images/{id}")]
HttpPost也是如此。
如果某些公共方法不是控制器中的操作,Swagger也会抛出相同的异常。解决方法是使它们全部为protected
或private
或如上所述添加属性[ApiExplorerSettings(IgnoreApi = true)]
。
我在要删除的未使用的类上得到TypeLoadException
。我的解决方法是删除bin / obj / Debug文件夹中的内容。干净的解决方案+重建解决方案无法解决我的问题。
我也收到此错误,因为我创建了一个具有[Route("api/[controller]")]
的控制器。放置后,错误消失了。