Web API:具有不同HTTP谓词的相同方法

Nag*_*aga 3 c# asp.net-web-api swagger

在WEB API控制器中,我们可以使用不同的HTTP谓词具有相同的方法名称吗?

  [HttpGet]
        public string Test()
        {
            return "Success Get";
        }


  [HttpPost]
        public string Test(int i)
        {
            return "Success Post";
        }
Run Code Online (Sandbox Code Playgroud)

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});
Run Code Online (Sandbox Code Playgroud)

Jer*_*ton 9

路线名称本身与Swagger无关.当Swagger检测到可能有歧义的路线时,它会因此错误而爆炸.模糊路由是单个路由(基本uri),返回多于一种类型的资源.出于某些疯狂的原因,Microsoft Web Api允许您为同一URI返回不同的资源,这是您在尝试使用API​​(和Swagger)时遇到麻烦的地方.

单个URI应代表单个资源.
正确的方式:

  1. GET/apples //返回一个苹果列表
  2. GET/apples?type = red //返回红苹果列表

方式不正确:

  1. GET/apples///返回一个苹果列表
  2. 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?!
}
Run Code Online (Sandbox Code Playgroud)

许多Swagger框架在运行时扫描您的代码并创建Swagger 2.0 JSON文档.Swagger UI请求JSON文档并构建您基于该文档看到的UI.
现在因为Swagger框架正在扫描你的代码来构建JSON,如果它看到两个方法代表一个返回不同类型并且中断的单个资源.发生这种情况是因为Swagger不知道如何表示该URI,因为它不明确.

以下是一些可以帮助解决此问题的方法:

  1. 确保使用单个资源类型表示单个路由(基本URI).
  2. 如果您必须表示具有不同类型的单个路由(通常是一个坏主意),那么您可以通过将以下属性添加到违规方法中来忽略使文档不明确的路由

    [ApiExplorerSettings(IgnoreApi = true)]

这将告诉文档在记录API和Swagger将呈现时完全忽略此方法.请记住,如果您使用#2,那么Swagger将不会呈现此方法,这可能会导致消费API的人出现问题.

希望这可以帮助.