您可以在.NET Web Api路由URL中使用正则表达式进行API版本控制

时间:2015-03-14 03:23:57

标签: asp.net .net asp.net-mvc asp.net-web-api asp.net-web-api-routing

在MVC和WebApi中,您可以为路线添加参数约束(请参阅http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#constraints)。您甚至可以将正则表达式用于参数约束。但是,我想知道是否可以使用正则表达式来处理API版本控制,其中许多路由可以/应该路由到相同的操作。

例如,我正在尝试在实际的URI中对我的API进行版本化,如下所示:

/api/v3/SomeResource

其中v3表示它是API的第3版。如果我使用的是我的API版本3,很可能许多操作在所有三个版本中都没有改变,因此需要回复:

/api/v1/SomeResource
/api/v2/SomeResource
/api/v3/SomeResource

因此,我希望能够像我一样在路由属性中加入一个正则表达式: [Route(“api / v(1 | 2 | 3)/ SomeResource”)]但似乎它不将v(1 | 2 | 3)视为正则表达式而是将其视为文字。换句话说,对/ api / v1 / SomeResource的请求不会执行此操作。

有可能完成我想要完成的任务吗?有没有办法把正则表达式放在我的路线上?

提前致谢!

2 个答案:

答案 0 :(得分:4)

看看这个: [HttpGet,Route(" Api / v {version:int:regex(1 | 2 | 3)} / SomeResource")]

参考: http://sampathloku.blogspot.com/2013/12/attribute-routing-with-aspnet-mvc-5.html

答案 1 :(得分:1)

不,这是不可能的。每MSDN

  

URL模式可以包含文字值和可变占位符(称为URL参数)。文字和占位符位于URL的段中,这些段由斜杠(/)字符分隔。

在这种情况下它也不是特别有用,因为您通常会将每个API版本路由到单独的控制器。因此,每个版本都需要一个单独的路由,而不是一个匹配所有版本的路由。

您已经关联的文档有一个专门涵盖API versioning的部分(虽然它没有提供太多细节)。