C# 如何在/api/v1实现版本化WebApi

C# 如何在/api/v1实现版本化WebApi,c#,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,asp.net-mvc-areas,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,Asp.net Mvc Areas,我想在现有的MVC项目中构建一个版本化的WebApi,这样我的URL就可以 /api/v1/account /api/v2/account 我目前不使用区域,但经过一些研究后,我认为这对我来说是可行的,但显然你不能嵌套区域(我目前正在使用MVC4,但可以升级到5) 我如何才能最好地实现这一点 更新 我最终使用了有两种方法可以通过Web API实现版本控制 方法1: /api/accountv1/ /api/accountv2/ /api/v1/account /api/v2/account

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

/api/v1/account
/api/v2/account
我目前不使用区域,但经过一些研究后,我认为这对我来说是可行的,但显然你不能嵌套
区域
(我目前正在使用MVC4,但可以升级到5)

我如何才能最好地实现这一点

更新

我最终使用了

有两种方法可以通过Web API实现版本控制

方法1:

/api/accountv1/
/api/accountv2/
/api/v1/account
/api/v2/account
在对API进行版本控制时,我发现最简单的方法是创建一个与“AccountV1Controller”相同的控制器,并将其命名为“AccountV2Controller”,注意控制器名称中的后缀V1和V2,我们将根据此部分根据API版本选择适当的控制器

方法2:

/api/accountv1/
/api/accountv2/
/api/v1/account
/api/v2/account
或者你也可以通过玩路线来获得同样的行为

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 }
);

摘自

这里有两种方法不需要您拥有两个独立的控制器类


请求标题

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

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

使用RouteConstraint

您也可以使用路线约束:

config.Routes.MapHttpRoute(
    name: "versionedApi",
    routeTemplate: "api/{version}/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new {version = @"^[vV]\d+$"}
);
然后version将变成一个route函数参数,就像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属性路由

此外,如果您确实升级到MVC5和WebAPI 2,则有一些示例说明如何使用属性路由实现这一点