我有两个控制器, ItemsController 和 SingleItemController 两者都继承自 ApiController 。两者都有RoutePrefix items/inventory 在控制器上定义,如下所示:
ItemsController
SingleItemController
ApiController
items/inventory
[RoutePrefix("items/inventory")]
我在Web API 2.2中使用AttributeRouting。
在里面 单个项目控制器 我有以下路线:
单个项目控制器
[Route("{itemReference}")] [HttpGet] public ItemDTO GetItem(string itemReference)
在里面 项目控制器 我有以下路线:
项目控制器
[Route("all")] [HttpGet] public List<ItemDTO> GetAllItems(DateTime dateFrom, DateTime dateTo)
当我试图击中 /items/inventory/all?dateFrom=2015-09-06&dateTo=2015-09-12 路由,我得到以下错误:
/items/inventory/all?dateFrom=2015-09-06&dateTo=2015-09-12
找到多个与URL匹配的控制器类型。这可以 如果多个控制器上的属性路由与请求的 网址。请求已找到以下匹配的控制器类型: 项目API.控制器.项目控制器 ItemAPI.Controllers.SingleItem控制器
所以 {itemReference} 路线与冲突 all 路线这是为什么?我想它会先预订 全部的 路由,然后允许可选的字符串路由。
{itemReference}
all
全部的
这是因为它无法决定“all”是否为项引用。 我最近遇到了一个类似的问题,我有一个带有“admin”路由前缀的控制器。
为了解决这个问题,我对参数设置了一个限制,即忽略单词“admin”。 因此,在您的情况下,您可以执行以下操作来忽略“all”一词:
[Route("{itemReference:regex(^(?!all))})]