首页 技术 正文
技术 2022年11月15日
0 收藏 396 点赞 3,746 浏览 2545 个字

 

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[].Value;//把版本号1提取除了
string ctrlTypeName = ctrlType.Name;//PersonController
var matchControler = Regex.Match(ctrlTypeName, "^(.+)Controller$");
if (!matchControler.Success)
{
continue;
}
string ctrlName = matchControler.Groups[].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[].Value;
string key = controller + "v" + verNum;
if (ctlMapping.ContainsKey(key))
{
return ctlMapping[key];
}
else
{
return base.SelectController(request);
} }
}
}

VersionControllerSelector

上一篇: LoadRunner之参数化
下一篇: C# PDF转Image图片
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,910
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,435
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,250
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,061
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,693
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,731