4.C#WebAPI多版本管理介绍及实现方案详解

小编 2026-07-02 阅读:1107 评论:0
1.什么是 API 的多版本?说白了就是多版本共存的问题。为方便大家理解我就举个例子吧,大家想必...

1.什么是 API 的多版本?

说白了就是多版本共存的问题。为方便大家理解我就举个例子吧,大家想必都用过Jquery吧,它的1.*版本做到了对低版本IE的支持;2.*版本还保留着ajax,但是不再支持老旧浏览器;3.*版本连ajax都不留了;但是用户不会升级、用户拒绝升级等原因,造成这些旧版本也需要运行,但是新版却已经修改了规范与旧版旧版冲突了。造成这些旧版本也需要运行使用。再例如我们手机有Android4.0、5.0、6.0、7.0、8.0或IOS8.0、9.0、10、11同时存在于市场也是类似的。

2.出现多版本问题我们通常的做法

旧版接口做成一个分支,除了进行 bug 修改外,旧版本接口不再做改动;新接口代码继续演化升级。在客户端请求的时候带着要请求的接口版本号,在服务器端选择合适的版本代码进行处理。

3.技术处理方案

(1)(最推荐)不同版本用不同的域名:v1.api.jiyuwu.com、v2.api.jiyuwu.com、v3……。

(2) 在url、报文头等中带不同的版本信息,用 Nginx 等做反向代理服务器,然后将 http://api.jiyuwu.com/api/V1/Login/1和http://api.jiyuwu.com/api/V2/Login/1转到不同的服务器处理。

(3) 多 个 版 本 的 Controller 共 处 在 一 个 项 目 中 , 然 后 使 用 [RoutePrefix] 或 者 IHttpControllerSelector 根据报文头、路径等选择不同的 Controller 执行。下面主要讲这两种方法。

4.针对3.(3)的两种方案的案例

 (1)[RoutePrefix] 案例

旧版保持原样不改变

4.C#WebAPI多版本管理介绍及实现方案详解4.C#WebAPI多版本管理介绍及实现方案详解
public class LoginController : ApiController    {        [HttpGet]        public string ToLogin(int id)        {            return "这是旧版" + id;        }    }
View Code

新版代码同时用路由处理

4.C#WebAPI多版本管理介绍及实现方案详解4.C#WebAPI多版本管理介绍及实现方案详解
[RoutePrefix("api/V2/Login")]    public class LoginV2Controller : ApiController    {        [Route("{id}")]        [HttpGet]        public string ToLogin(int id)        {            return "这是新版" + id;        }    }
View Code

4.C#WebAPI多版本管理介绍及实现方案详解

(2) IHttpControllerSelector 案例

4.C#WebAPI多版本管理介绍及实现方案详解项目结构如图

(1)添加VersionnControllerSelector类

4.C#WebAPI多版本管理介绍及实现方案详解4.C#WebAPI多版本管理介绍及实现方案详解
public class VersionnControllerSelector : DefaultHttpControllerSelector    {        public HttpConfiguration _config;        public VersionnControllerSelector(HttpConfiguration config)            : base(config)        {            _config = config;        }        public override IDictionary<string, System.Web.Http.Controllers.HttpControllerDescriptor> GetControllerMapping()        {            Dictionary<string, HttpControllerDescriptor> dic = new Dictionary<string, HttpControllerDescriptor>();            foreach (var ams in _config.Services.GetAssembliesResolver().GetAssemblies())            {                //获取继承自ApiControl的非抽象类                var controlTypes = ams.GetTypes().Where(p => !p.IsAbstract && typeof(ApiController).IsAssignableFrom(p)).ToArray();                foreach (var ctrlType in controlTypes)                {                    //从namespace中提取出版本号                    var match = Regex.Match(ctrlType.Namespace,                    @"MoreVersionContorl.Controllers.V(d+)");                    if (match.Success)                    {                        string verNum = match.Groups[1].Value;//获取版本号                        string ctrlName =                        Regex.Match(ctrlType.Name, "(.+)Controller").Groups[1].Value;//从LoginController中拿到Login                        string key = ctrlName + "V" + verNum;//Personv2为key                        dic[key] = new HttpControllerDescriptor(_config, ctrlName, ctrlType);                    }                }            }            return dic;        }        public override System.Web.Http.Controllers.HttpControllerDescriptor SelectController(HttpRequestMessage request)        {            //获取所有Controller集合            var controllers = GetControllerMapping();            //获取路由数据            var routeData = request.GetRouteData();            //从路由中获取当前controller的名称            var controllerName = (string)routeData.Values["controller"];            //从url中获取到版本号            string verNum =            Regex.Match(request.RequestUri.PathAndQuery, @"api/V(d+)").Groups[1].Value;            string key = controllerName + "V" + verNum;//获取Loginv2            if (controllers.ContainsKey(key))//获取HttpControllerDescriptor            {                return controllers[key];            }            else            {                return null;            }        }    }
View Code

(2)创建V1和V2下的两个控制器

1) V1下的LoginController

4.C#WebAPI多版本管理介绍及实现方案详解4.C#WebAPI多版本管理介绍及实现方案详解
 public class LoginController : ApiController    {        public string Get(int id)        {            return "This Version is V1,id=" + id;        }    }
View Code

2) V2下的LoginController

4.C#WebAPI多版本管理介绍及实现方案详解4.C#WebAPI多版本管理介绍及实现方案详解
public class LoginController : ApiController    {        public string Get(int id)        {            return "This Version is V2,id="+id;        }    }
View Code

(3)修改WebApiConfig

4.C#WebAPI多版本管理介绍及实现方案详解4.C#WebAPI多版本管理介绍及实现方案详解
public static void Register(HttpConfiguration config)        {            // Web API 配置和服务            // Web API 路由            config.MapHttpAttributeRoutes();            //config.Routes.MapHttpRoute(            //    name: "DefaultApi",            //    routeTemplate: "api/{controller}/{id}",            //    defaults: new { id = RouteParameter.Optional }            //);            config.Routes.MapHttpRoute(            name: "DefaultApiV1",            routeTemplate: "api/V1/{controller}/{action}/{id}",            defaults: new { id = RouteParameter.Optional }            );            config.Routes.MapHttpRoute(            name: "DefaultApiV2",            routeTemplate: "api/V2/{controller}/{action}/{id}",            defaults: new { id = RouteParameter.Optional }            );            config.Services.Replace(typeof(IHttpControllerSelector),            new VersionnControllerSelector(config));        }
View Code

(4)配置完毕请求结果如图:

4.C#WebAPI多版本管理介绍及实现方案详解

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表