在 WEB API 控制器中,我们可以使用相同的方法名称和不同的 HTTP 动词吗?
[HttpGet]
public string Test()
{
return "Success Get";
}
[HttpPost]
public string Test(int i)
{
return "Success Post";
}
Swagger 不接受此配置。访问 API 方法时出现此错误:
500:“Message”:“发生错误。”,“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});
对于 Swagger 来说,方法名称本身并不重要,重要的是路由。当 Swagger 检测到潜在不明确的路线时,它会因该错误而爆炸。不明确的路由是返回超过 1 种资源类型的单个路由(基本 uri)。由于某些疯狂的原因,Microsoft Web Api 允许您为相同的 URI 返回不同的资源,这就是当人们试图使用您的 API(和 Swagger)时您会遇到麻烦的地方。
单个 URI 应代表单个资源。
正确方法:
- GET /apples // 返回苹果列表
- GET /apples?type=red // 返回红苹果列表
不正确的方法:
- GET /apples/ // 返回苹果列表
- GET /apples?type=red // 返回一辆自卸卡车
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,因为它不明确。
您可以采取以下一些措施来帮助解决此问题:
- 确保您使用单一资源类型表示单一路由(基本 URI)。
-
如果您必须表示具有不同类型的单个路由(通常是一个坏主意),那么您可以通过向有问题的方法添加以下属性来忽略使文档不明确的路由
[ApiExplorerSettings(IgnoreApi = true)]
这将告诉文档在记录 API 时完全忽略此方法,并且 Swagger 将呈现。请记住,如果您使用#2,那么 Swagger 将不会呈现此方法,这可能会给使用您的 API 的人带来问题。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)