使用路由属性的 Web API 路由 - 发现多个与请求匹配的操作

Web API routing using RouteAttribute - Multiple actions were found that match the reques

在我的 Web API 2 项目中,我有两个 POST 方法:

[HttpPost]
public virtual IHttpActionResult Create([FromBody]TDto value) { ... }

[Route("many")]
[HttpPost]
public virtual void CreateMany([FromBody]TDto[] value) { ... }

我的路线模板如下所示:

config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}")

当我将 POST 转换为 http://server/api/Products 时,出现以下错误:"Multiple actions were found that match the request: Create on type ProductsController, CreateMany on type ProductsController"

为什么RouteAttribute设置为"many"的方法匹配路由? "many" 不应该是 URL 的强制性部分吗?

当我post到http://server/api/Products/many时调用了正确的方法。

我知道我可以通过在路由属性中指定顺序来解决这个问题,但我想了解为什么会这样。

编辑:
刚刚发现,如果我向 Create-method 添加一个空路由,它会按我想要的方式工作:

[Route("")] // <-- ADDED THIS
[HttpPost]
public virtual IHttpActionResult Create([FromBody]TDto value) { ... }

[Route("many")]
[HttpPost]
public virtual void CreateMany([FromBody]TDto[] value) { ... }

如果有人能解释为什么会这样,我仍然洗耳恭听:-)

好吧,也许这毕竟不是那么奇怪...

在我原来的设置中是这样的:

  • 当执行 POST 到 http://server/api/Products/many 时,它通过其 RouteAttribute 匹配第二个方法。无需检查 "DefaultApi"-路由。这样就奏效了。
  • 当对 http://server/api/Products 执行 POST 时,它不匹配任何 RouteAttribute 路由,因此它检查 "DefaultApi"-路由并且两种方法都匹配配置中的路由。我得到 "Multiple actions..."-exception.

将 [Route("")] 添加到第一个方法后,会发生以下情况:

我想我相信 RouteAttribute 禁用了该方法的 "DefaultApi"-route。显然不是这样。