代码之家  ›  专栏  ›  技术社区  ›  Gaui

AttributeRouting与字符串路由冲突的参数路由

  •  3
  • Gaui  · 技术社区  · 9 年前

    我有两个控制器, ItemsController SingleItemController 两者都继承自 ApiController 。两者都有RoutePrefix 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 路由,我得到以下错误:

    找到多个与URL匹配的控制器类型。这可以 如果多个控制器上的属性路由与请求的 网址。请求已找到以下匹配的控制器类型: 项目API.控制器.项目控制器 ItemAPI.Controllers.SingleItem控制器

    所以 {itemReference} 路线与冲突 all 路线这是为什么?我想它会先预订 全部的 路由,然后允许可选的字符串路由。

    1 回复  |  直到 9 年前
        1
  •  4
  •   Craig H    9 年前

    这是因为它无法决定“all”是否为项引用。
    我最近遇到了一个类似的问题,我有一个带有“admin”路由前缀的控制器。

    为了解决这个问题,我对参数设置了一个限制,即忽略单词“admin”。
    因此,在您的情况下,您可以执行以下操作来忽略“all”一词:

    [Route("{itemReference:regex(^(?!all))})]