.NET 4.7.2下同一控制器新增v2版本API端点路由的实现方案
解决方案
以下两种方案都可实现在同一个控制器中兼容两个版本路由的需求,无需拆分控制器文件。
方案1:追加全局路由配置(改造成本最低)
不需要修改现有控制器代码,只需要在原有路由配置处新增一条v2版本的路由映射即可,两个路由会同时指向同一个MyApi控制器的POST方法:
// 原有v1路由完全保留 config.Routes.MapHttpRoute( name: "MyApi", routeTemplate: "api/v1/{param}/string1/string2", defaults: new { controller = "MyApi", ... }) // 新增v2路由,同样绑定MyApi控制器 config.Routes.MapHttpRoute( name: "MyApiV2", routeTemplate: "api/v2/{param}/string1/string2", defaults: new { controller = "MyApi", ... })
如果两个版本逻辑存在差异,可以在控制器方法内通过路由信息判断当前请求的版本:
// 控制器内获取版本号示例 var routeTemplate = Request.GetRouteData().Route.RouteTemplate; string apiVersion = routeTemplate.Contains("v1") ? "v1" : "v2"; // 按版本分支处理对应逻辑
方案2:使用特性路由(路由规则和控制器绑定更灵活)
如果偏好把路由规则和控制器写在一起,可以通过特性路由实现:
- 首先在
WebApiConfig中开启特性路由支持,需要放在全局路由配置之前:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 开启特性路由支持 config.MapHttpAttributeRoutes(); // 原有全局路由配置可保留,也可以删除对应MyApi的路由规则 // config.Routes.MapHttpRoute(...); } }
- 在控制器的POST方法上叠加两个路由特性即可:
public class MyApiController : ApiController { [HttpPost] [Route("api/v1/{param}/string1/string2")] [Route("api/v2/{param}/string1/string2")] public IHttpActionResult YourPostMethod(string param) { // 原有逻辑处理,需要区分版本的话和方案1判断逻辑一致 } }
如果控制器下所有接口都需要同时支持v1和v2,可以给控制器加两个路由前缀简化写法:
[RoutePrefix("api/v1")] [RoutePrefix("api/v2")] public class MyApiController : ApiController { [HttpPost] [Route("{param}/string1/string2")] public IHttpActionResult YourPostMethod(string param) { // 逻辑处理 } }
注意事项
- 路由配置中的参数名需要和Action方法的入参名完全一致,避免参数绑定失败
- 如果两个版本的入参、返回值结构差异较大,可以在同一个控制器中声明两个不同的Action方法,分别绑定对应版本的路由即可
内容的提问来源于stack exchange,提问作者Iria
相关产品推荐
相关产品推荐

