查询参数路由约束

时间:2014-02-05 21:34:36

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

我刚开始使用ASP.NET Web API 2.1并遇到了限制。使用属性路由,我可以执行以下操作:

[Route("item/{id:int}")]
public IHttpActionResult GetItem(int id)
{
    ...
}

网址/item/5将被路由到此操作,但由于/item/abc中的int限制,网址{id:int}将不会。

我尝试更改我的网址,以便id参数在查询字符串中及其约束,尽管在查询参数中使用的路由约束从未在文档中提及或演示过。

[Route("item?{id:int}")]
public IHttpActionResult GetItem(int id)
{
    ...
}

如果我现在尝试运行,则Configure中的Application_Start方法调用会出错。

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

信息如下。

  

用户代码未处理ArgumentException

     

路由模板不能以'/'或'〜'字符开头,也不能包含'?'字符。

有两件事让我烦恼。

首先,MSDN上的the section documenting Route Prefixes表明在路由模板的开头放置~字符是完全可以接受的。我尝试了它,它的工作原理。

其次,如果不是这样,我如何在查询参数上放置路由约束?考虑以下情况,删除路径约束。

[Route("item")]
public IHttpActionResult GetItem(int id)
{
    ...
}

网址/item/5将路由到此操作,id设置为5 - 但网址/item/abc也设置为id 0

是否无法对查询参数设置路由约束?

1 个答案:

答案 0 :(得分:9)

根据http://attributerouting.net/#asp-net-web-api (†) ,这是不可能的:

  

" 小心!由于Web API WebHost框架的集成问题,以下功能无效:...

     
      
  • 查询字符串参数约束,..."
  •   

†) 请注意,此答案是针对以前版本的Web API编写的,其中属性路由是使用单独的AttributeRouting.WebApi NuGet package完成的。此后,属性路由已incorporated into the Web API core。尽管如此,似乎仍然不支持开箱即用的查询字符串参数约束。