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

 

posted on 2017-11-29 12:02  愚公学编程  阅读(393)  评论(0编辑  收藏  举报