【问题标题】:Can you use a regex in .NET WebApi Route URI For API Versioning您可以在 .NET WebApi 路由 URI 中使用正则表达式进行 API 版本控制吗
【发布时间】:2015-05-16 16:39:17
【问题描述】:

在 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 的请求不会执行此操作。

是否有可能完成我想要完成的事情?有没有办法在我的路线中加入正则表达式?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    不,这是不可能的。根据MSDN

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

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

    您已经链接的文档有一个部分专门涵盖API versioning(尽管它没有提供太多细节)。

    【讨论】:

    • 我实际上能够使用路由约束来实现我想要的。请参阅已接受的答案。还是谢谢。
    • 这不是你问的。您询问是否可以在路由的 URL 部分中使用正则表达式,但您不能。当然,您可以在约束范围内使用正则表达式,但这不是您的问题。
    • 我会调整我的问题以使其更清楚。它实际上是关于解决特定问题(我可以使用正则表达式将不同的 URI 映射到相同的操作)。我认为我不必要地假设路由约束不能用于解决问题,因为它们仅用于操作的输入参数。
    【解决方案2】:

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

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

    【讨论】:

    • 这实际上就像一个冠军!我错误地假设路由约束(支持正则表达式)必须映射到操作的输入参数,但它们没有。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2018-03-14
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2014-08-17
    • 2015-11-28
    相关资源
    最近更新 更多