• WebApi的版本控制


     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Http;
    using System.Web.Http.Dispatcher;
    
    namespace WebApi多版本控制1
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApiV1",
                    routeTemplate: "api/v1/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
                config.Routes.MapHttpRoute(
                name: "DefaultApiV2",
                routeTemplate: "api/v2/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
                config.Services.Replace(typeof(IHttpControllerSelector), new VersionControllerSelector(config));
            }
        }
    }
    WebApiConfig
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Text.RegularExpressions;
    using System.Web;
    using System.Web.Http;
    using System.Web.Http.Controllers;
    using System.Web.Http.Dispatcher;
    
    namespace WebApi多版本控制1
    {
        public class VersionControllerSelector:DefaultHttpControllerSelector
        {
            private HttpConfiguration config;
            private IDictionary<string, HttpControllerDescriptor> ctlMapping;
            public VersionControllerSelector(HttpConfiguration config ):base(config)
            {
                this.config = config;
            }
            public override IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
            {
                Dictionary<string, HttpControllerDescriptor> dict = new Dictionary<string, HttpControllerDescriptor>();
                foreach (var asm in config.Services.GetAssembliesResolver().GetAssemblies())
                {
                  var controllerTypes=  asm.GetTypes().Where(t => t.IsAbstract == false && typeof(ApiController).IsAssignableFrom(t));
                    foreach (var ctrlType in controllerTypes)
                    {
                      string ctrlTypeNS=  ctrlType.Namespace ;
                      var match=   Regex.Match(ctrlTypeNS, @".v(d)");
                        if (!match.Success)
                        {
                            continue;
                        }
                      
                            string verNum = match.Groups[1].Value;//把版本号1提取除了
                            string ctrlTypeName = ctrlType.Name;//PersonController
                            var matchControler = Regex.Match(ctrlTypeName, "^(.+)Controller$");
                            if (!matchControler.Success)
                            {
                            continue;
                            }
                        string ctrlName = matchControler.Groups[1].Value;
                        string key = ctrlName + "v" + verNum;//Personv1
                        dict[key] = new HttpControllerDescriptor(config, ctrlName, ctrlType); 
                    }
                }
                ctlMapping = dict;
                return dict;
    
            }
            public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
            {
                string controller=  (string)  request.GetRouteData().Values["controller"];
                if (ctlMapping==null)
                {
                    ctlMapping = GetControllerMapping();
                }
                
                var matchVer = Regex.Match(request.RequestUri.PathAndQuery, @"/v(d+)/");
                if (!matchVer.Success)
                {
                    return base.SelectController(request);
                }
                string verNum = matchVer.Groups[1].Value; 
                string key = controller + "v" + verNum;
                if (ctlMapping.ContainsKey(key))
                {
                    return ctlMapping[key];
                }
                else
                {
                    return base.SelectController(request);
                }
                
            }
        }
    }
    VersionControllerSelector
  • 相关阅读:
    for循环中创建线程执行问题
    MySQL学习总结之路(第六章:表类型【存储引擎】的选择)
    Tensorflow的下载和安装
    C# 和 Python 的 hash_md5加密方法
    MySQL学习总结之路(第五章:函数)
    MySQL学习总结之路(第四章:运算符)
    MySQL学习总结之路(第三章:数据类型)
    MySQL学习总结之路(第二章:表)
    MySQL学习总结之路(服务与数据库管理)
    CSS居中的方式15种(水平垂直)
  • 原文地址:https://www.cnblogs.com/qq605490312/p/7919653.html
Copyright © 2020-2023  润新知