Web API:使用不同HTTP谓词的相同方法

在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}); 

方法名称本身与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?! } 

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

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

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

    [ApiExplorerSettings(IgnoreApi = true)]

这将告诉文档在记录API和Swagger将呈现时完全忽略此方法。 请记住,如果您使用的是#2,那么Swagger将不会渲染此方法,这会导致人们使用API​​时遇到问题。

希望这可以帮助。

在配置文件中不要破坏您的默认路由。

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 

我用这种方式解决了这个问题。 只需在方法开始之前使用那些行。

 [Route("api/Test")] [Route("api/Test/{id}")]