使用路由属性的 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("")] 添加到第一个方法后,会发生以下情况:
- POST 到 http://server/api/Products/many 仍然以同样的方式工作。
- 当对 http://server/api/Products 执行 POST 时,它匹配新的(空的)RouteAttribute。无需检查 "DefaultApi"-路由。一切正常。
我想我相信 RouteAttribute 禁用了该方法的 "DefaultApi"-route。显然不是这样。
在我的 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("")] 添加到第一个方法后,会发生以下情况:
- POST 到 http://server/api/Products/many 仍然以同样的方式工作。
- 当对 http://server/api/Products 执行 POST 时,它匹配新的(空的)RouteAttribute。无需检查 "DefaultApi"-路由。一切正常。
我想我相信 RouteAttribute 禁用了该方法的 "DefaultApi"-route。显然不是这样。