【问题标题】:How to achieve versioned WebApi at /api/v1如何在 /api/v1 实现版本化 WebApi
【发布时间】:2017-01-27 18:19:54
【问题描述】:

我想在现有的 MVC 项目中构建一个版本化的 WebApi,以便我的 URL 可以是

/api/v1/account
/api/v2/account

我目前不使用区域,但经过一些研究,我认为这对我有用,但显然你不能嵌套 Areas(我目前使用 MVC4,但可以升级到 5)。

我怎样才能最好地做到这一点?

更新

我最终使用了this

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-mvc-areas


    【解决方案1】:

    两种方式使用 Web API 实现版本控制

    方法一:

    /api/accountv1/
    /api/accountv2/
    

    我发现对 API 进行版本控制的最简单方法是创建一个与“AccountV1Controller”相同的控制器并将其命名为“AccountV2Controller”,注意后缀 V1 和 V2控制器名称,我们将依赖这部分根据 API 版本选择合适的控制器。

    方法二:

    /api/v1/account
    /api/v2/account
    

    或者您可以使用 Routes 来获得相同的行为

    config.Routes.MapHttpRoute(
        name: "1-0Api",
        routeTemplate: "api/v1/Account/{id}",
        defaults: new { controller = "AccountV1", id = RouteParameter.Optional }
    );
    config.Routes.MapHttpRoute(
        name: "2-0Api",
        routeTemplate: "api/v2/Account/{id}",
        defaults: new { controller = "AccountV2", id = RouteParameter.Optional }
    );
    

    取自here

    【讨论】:

      【解决方案2】:

      这里有两种方法不需要您拥有 2 个单独的 Controller 类。


      请求标头

      推荐的版本控制设计之一是使用请求标头而不是 URL 参数。

      if (Request.Headers["API Version"] == "2")
      {
          return Version2Code();
      }
      return Version1Code();
      

      使用 RouteContraint

      你也可以使用路由约束:

      config.Routes.MapHttpRoute(
          name: "versionedApi",
          routeTemplate: "api/{version}/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional },
          constraints: new {version = @"^[vV]\d+$"}
      );
      

      那么version就变成了跟id一样的路由函数参数了。

      public class AccountController: Controller {
      
          public class ActionResult Index(object id, string version)
          {
             if (string.Equals(version, "v2", StringComparison.OrdinalIgnoreCase))
             {
                return Version2Code();
             }
             return Version1Code();
          }
      }
      

      另外,请查看 Web API 2 属性路由

      此外,如果您确实升级到 Mvc 5 和 WebAPI 2,还有一些示例说明如何使用属性路由 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 进行此操作

      【讨论】:

        猜你喜欢
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 2017-06-14
        相关资源
        最近更新 更多