zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Windows 2008server部署pxe启动安装windows系统
    wordpress迁移报错
    解决PHP无法监听9000端口问题/502错误解决办法
    Failed to start LSB: starts php-fpm
    nginx.service: control process exited, code=exited status=1
    linux通过ntp同步时间
    ESXI6.7主机降级至ESXI6.5
    在vCenter Server中添加ESXi 主机失败的问题
    windows ping bat脚本
    不错的网站压力测试工具webbench
  • 原文地址:https://www.cnblogs.com/qq605490312/p/7919653.html
Copyright © 2011-2022 走看看