AttributeRouting 参数路由与字符串路由冲突
AttributeRouting conflicting parameter route with string route
我有两个控制器,ItemsController
和 SingleItemController
,它们都继承自 ApiController
。两者都在控制器上定义了 RoutePrefix items/inventory
,如下所示:
[RoutePrefix("items/inventory")]
我在 Web 中使用 AttributeRouting API 2.2.
在 SingleItemController
我有以下路线:
[Route("{itemReference}")]
[HttpGet]
public ItemDTO GetItem(string itemReference)
在ItemsController
我有以下路线:
[Route("all")]
[HttpGet]
public List<ItemDTO> GetAllItems(DateTime dateFrom, DateTime dateTo)
当我尝试走 /items/inventory/all?dateFrom=2015-09-06&dateTo=2015-09-12
路线时,出现以下错误:
Multiple controller types were found that match the URL. This can
happen if attribute routes on multiple controllers match the requested
URL. The request has found the following matching controller types:
ItemAPI.Controllers.ItemsController
ItemAPI.Controllers.SingleItemController
所以 {itemReference}
路由与 all
路由冲突。为什么是这样?我认为它首先保留 all
路由,然后允许可选的字符串路由。
这是因为它无法判断"all"是否是项目参考。
我最近有一个类似的问题,我有一个带有 "admin" 路由前缀的控制器。
为了解决这个问题,我对参数施加了约束以忽略单词 "admin"。
因此,在您的情况下,您可以执行以下操作来忽略 "all" 这个词:
[Route("{itemReference:regex(^(?!all))})]
我有两个控制器,ItemsController
和 SingleItemController
,它们都继承自 ApiController
。两者都在控制器上定义了 RoutePrefix items/inventory
,如下所示:
[RoutePrefix("items/inventory")]
我在 Web 中使用 AttributeRouting API 2.2.
在 SingleItemController
我有以下路线:
[Route("{itemReference}")]
[HttpGet]
public ItemDTO GetItem(string itemReference)
在ItemsController
我有以下路线:
[Route("all")]
[HttpGet]
public List<ItemDTO> GetAllItems(DateTime dateFrom, DateTime dateTo)
当我尝试走 /items/inventory/all?dateFrom=2015-09-06&dateTo=2015-09-12
路线时,出现以下错误:
Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL. The request has found the following matching controller types: ItemAPI.Controllers.ItemsController ItemAPI.Controllers.SingleItemController
所以 {itemReference}
路由与 all
路由冲突。为什么是这样?我认为它首先保留 all
路由,然后允许可选的字符串路由。
这是因为它无法判断"all"是否是项目参考。
我最近有一个类似的问题,我有一个带有 "admin" 路由前缀的控制器。
为了解决这个问题,我对参数施加了约束以忽略单词 "admin"。
因此,在您的情况下,您可以执行以下操作来忽略 "all" 这个词:
[Route("{itemReference:regex(^(?!all))})]