在WEB API控制器中,我们可以使用不同的HTTP谓词具有相同的方法名吗?
[HttpGet]
public string Test()
{
return "Success Get";
}
[HttpPost]
public string Test(int i)
{
return "Success Post";
}
Swagger不接受此配置。访问API方法时出现此错误:
500:“消息”:“发生错误。”,“ExceptionMessage”:“Swagger 2.0不支持:路径'api / Common'和方法'POST'的多个操作。请参阅配置设置 - \” ResolveConflictingActions \“为潜在的解决方法”
这是我的routeconfig
:
config.Routes.MapHttpRoute(
name: "DefaultApiByName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApiByAction",
routeTemplate: "api/{controller}/{action}"
);
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional});
答案 0 :(得分:8)
方法名称本身与Swagger无关,路由可以。当Swagger检测到可能有歧义的路线时,它会因此错误而爆炸。模糊路由是单个路由(基本uri),返回多于一种类型的资源。出于某种疯狂的原因,Microsoft Web Api允许您为相同的URI返回不同的资源,这是您尝试使用API(和Swagger)的人遇到麻烦的地方。
单个URI应代表单个资源 正确的方式:
方式不正确:
Microsoft Web Api允许您使用多种方法处理单个路由,因此您会非常严重地意外创建模糊路由。
将破坏Swagger的代码示例:
[HttpGet, Route("apples")]
public HttpResponseMessage GetApples()
{
return _productRepository.Get(id);
}
[HttpGet, Route("apples")]
pblic HttpResponseMessage GetApples([FromUri]string foo)
{
return new DumpTruck(); // Say WHAAAAAAT?!
}
许多Swagger框架在运行时扫描您的代码并创建Swagger 2.0 JSON文档。 Swagger UI请求JSON文档并构建基于该文档看到的UI 现在因为Swagger框架正在扫描你的代码来构建JSON,如果它看到两个方法代表一个返回不同类型并且中断的单个资源。这是因为Swagger不知道如何表示该URI,因为它不明确。
您可以采取以下措施来解决此问题:
如果您必须使用不同类型(通常是一个坏主意)来表示单个路由,那么您可以通过将以下属性添加到有问题的方法来忽略使文档不明确的路由
[ApiExplorerSettings(IgnoreApi = true)]
这将告诉文档在记录API和Swagger将呈现时完全忽略此方法。请记住,如果您使用#2,那么Swagger将不会渲染此方法,这会导致使用API的人员出现问题。
希望这有帮助。
答案 1 :(得分:2)
在配置文件中不要破坏默认路由。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我用这种方式解决了这个问题。只需在方法开始之前使用那些行。
[Route("api/Test")]
[Route("api/Test/{id}")]
答案 2 :(得分:0)
注释以下代码:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
并编写以下代码:
config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}");
答案 3 :(得分:0)
在冲突的方法上添加单独的路由。例如一个上方的[Route("GetByType")]
和另一个上的[Route("GetById")]
。
或者,对于ASP.NET Core,请在启动文件上大摇大摆地添加以下配置:
services.AddSwaggerGen(options =>
{
options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
}