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)); } } }
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); } } } }