使用RouteAttribute进行Web API路由 - 找到了与请求匹配的多个操作

时间:2015-05-27 16:35:27

标签: c# asp.net-web-api2 asp.net-web-api-routing

在我的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}")

当我向http://server/api/Products发布POST时,我收到以下错误:"找到了与请求匹配的多个操作:在ProductsController类型上创建,在类型ProductsController上创建CreateMany"

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

当我发布到http://server/api/Products/many时,会调用正确的方法。

我知道我可以通过在Route属性中指定Order来解决问题,但我想了解为什么会发生这种情况。

修改
刚刚发现如果我在Create-method中添加了一个空路径,它可以按我的意愿工作:

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

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

如果有人能解释为什么会发生这种情况,我仍然全力以赴: - )

1 个答案:

答案 0 :(得分:0)

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

在我原来的设置中,这就是:

  • http://server/api/Products/many进行POST时,它的RouteAttribute与第二种方法匹配。无需检查&#34; DefaultApi&#34; -routing。这很有用。
  • 当对http://server/api/Products进行POST时,它与任何RouteAttribute路由都不匹配,因此它会检查&#34; DefaultApi&#34; -routing和两个方法匹配config中的路由。我得到了&#34;多个动作......&#34; -exception。

将[Route(&#34;&#34;)]添加到第一种方法后,会发生以下情况:

我认为我认为RouteAttribute禁用了该方法的&#34; DefaultApi&#34; -route。显然情况并非如此。