在ASP.NET Web API中,当我们的API发生改变,就涉及到版本问题了。如何实现API的版本呢?

1、通过路由设置版本

最简单的一种方式是通过路由设置,不同的路由,不同的版本,不同的controller。

config.Routes.MapHttpRoute(
name: "Food",
routeTemplate: "api/v1/nutrition/foods/{foodid}",
defaults:...
) config.Routes.MapHttpRoute(
name: "Foodv2",
routeTemplate: "api/v2/nutrition/foods/{foodid}",
defaults:...
)

2、通过HttpControllerSelector

通过更改HttpControllerSelector也可以实现。

首先写一个继承 DefaultHttpControllerSelector的类。

using System.Web.http.Dispatcher

public class CountingKsControllerSelector : DefaultHttpControllerSelector
{
private HttpConfiguraion _config; public CountgKsControllerSelector(HttpConfiguraiton cofig) : base(config)
{
_config = config;
} //设计就是返回HttpControllerDesriptor的过程
public override System.Web.Http.Controllers.HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
//获取所有的controller键值集合
var controllers = GetControllerMapping(); //获取路由数据
var routeData = request.GetRouteData(); //从路由中获取当前controller的名称
var controllerName = (string)routeData.Values["controller"]; HttpControllerDescriptor descriptor; if(controllers.TryGetValue(controllerName, out descriptor))
{
var version = ""; //从QueryString中获取版本
var newName = string.Concat(controllerName, "V", version); HttpControllerDescriptor versionedDescriptor; if(controllers.TryGetValue(newName, out versionedDescriptor))
{
return versionedDescriptor;
} return descriptor;
} return null; }
}

在WebApiConfig.cs注册自定义的ControllerSelector

config.Services.Replace(typeof(IHttpControllerSelector), new CountingKsControllerSelector(config) );

以上是大致的实现思路。具体来说可以通过如下几种方式实现。

■ 通过Query String实现版本

客户端大致这样请求:

http://localhost:8901/api/nutrition/foods/4492/measures/7269?v=2

using System.Web.http.Dispatcher

public class CountingKsControllerSelector : DefaultHttpControllerSelector
{
private HttpConfiguraion _config; public CountgKsControllerSelector(HttpConfiguraiton cofig) : base(config)
{
_config = config;
} //设计就是返回HttpControllerDesriptor的过程
public override System.Web.Http.Controllers.HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
//获取所有的controller键值集合
var controllers = GetControllerMapping(); //获取路由数据
var routeData = request.GetRouteData(); //从路由中获取当前controller的名称
var controllerName = (string)routeData.Values["controller"]; HttpControllerDescriptor descriptor; if(controllers.TryGetValue(controllerName, out descriptor))
{
//var version = "2"; //从QueryString中获取版本
var version = GetVersionFromQueryString(request); var newName = string.Concat(controllerName, "V", version); HttpControllerDescriptor versionedDescriptor; if(controllers.TryGetValue(newName, out versionedDescriptor))
{
return versionedDescriptor;
} return descriptor;
} return null; } //从QueryString中获取版本
private string GetVersionFromQueryString(HttpRequestMessage request)
{
var query = HttpUtility.ParseQueryString(request.RequestUri.Query);
var version = query["v"];
if(version != null)
{
return version;
} return "";
}
}

■ 通过Header实现版本

客户端大致这样请求:

User-Agent:Fiddler
Host:locahohost:8901
X-CountingKs-Version:2

private string GetVersionFromHeader(HttpRequestMessage request)
{
const string HEADER_NAME = "X-CountingKs-Version"; if(request.Headers.Contains(HEADER_NAME))
{
var header = request.Headers.GetValues(HEADER_NAME).FirstOrDefault(); if(header != null)
{
return header;
}
}
return "";
}

■ 通过Accept-Header实现版本

客户端大致这样请求:

User-Agent:Fiddler
Host:locahohost:8901
Accept: application/json;version=2

private string GetVersionFromAcceptHeaderVersion(HttpRequestMessage request)
{
var accept = request.Headers.Accept; foreach(var mime in accept)
{
if(mime.MediaType == "applicaiton/json")
{
var value = mime.Parameters
.Where(v => v.Name.Equals("version",StringComparison.OrdinalIngoreCase))
.FirstOrDefault(); return value.Value;
}
} return ""; }

■ 通过MediaType实现版本

在WebApiConfig.cs中

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); CreateMediaTypes(jsonFormatter); private static void CreateMediaTypes(JsonMediaTypeFormatter jsonFormatter)
{
var mediaTypes = new string[]
{
"application/vnd.counting,s.food.v1+json",
"application/vnd.countingks.measure.v1+json",
"application/vnd.countgks.measure.v2+json",
"applicatikon/vnd.countingks.diary.v1+json",
"application/vnd.countingks.diaryEntry.v1+json"
}; foreach(var mediaType in mediaTypes)
{
jsonFormatter.SupportedMeidaTypes.Add(new MediaTypeHeaderValue(mediaType));
}
}

在客户端大致这样请求:

User-Agent:Fiddler
Host:localhost:8901
Accept:application/vnd.countingks.food.v1+json

private string GetVersonFromMediaType(HttpRequestMessage request)
{
var accept = request.Headers.Accept;
var ex = new Regex(@"application\/vnd\.countingks\.([a-z]+)\.v([0-9]+)\+json". RegexOptions.IgnoreCase); foreach(var mime in accept)
{
var match = ex.Match(mime.MediaType);
if(match != null)
{
return match.Groups[].Value;
}
}
return "";
}

■ 使用SDammann.WebApi.Versioning

https://github.com/Sebazzz/SDammann.WebApi.Versioning

ASP.NET Web API中实现版本的几种方式的更多相关文章

  1. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

  2. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  3. ASP.NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  4. ASP.NET Web API中使用OData

    在ASP.NET Web API中使用OData 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在ASP.NET Web API中,对于CRUD(creat ...

  5. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  6. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  7. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理

  8. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  9. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

随机推荐

  1. 解决getJSON跨域登录Session丢失的问题

    最近在做项目中发现,我用下面的代码异步请求到login.ashx: var memberUrl = rooturl + 'member.ashx?r=' + Math.random() + '& ...

  2. ASP.NET MVC3 Model的常用验证示例

    1.金额(10位整数,2位小数) #region 余额 /// <summary> /// 余额 /// </summary> [DisplayName("余额&qu ...

  3. 刘昕鑫 C# 特性详解

    C# 特性详解 特性(attribute)是被指定给某一声明的一则附加的声明性信息. 在C#中,有一个小的预定义特性集合.在学习如何建立我们自己的定制特性(custom attributes)之前,我 ...

  4. 环境变量GOBIN导致GoClipse运行出现异常

    Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developers Photon Release (4. ...

  5. C# 各版本新特性

    C# 2.0 泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection&l ...

  6. ajax最基础入门

    1.介绍 AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重 ...

  7. #JS 获取屏幕分辨率、网页可见区域等

    window.screen document.body <script type="text/javascript"> function getInfo(){ var ...

  8. weblogic在64位windows的设置

    最近遇到一些问题,需要调整weblogic的内存用于做压力测试,weblogic默认的内存是远远不能满足当前测试需求.由于服务器是64位8G的内存,但是在服务器上安装的jdk和weblogic都是32 ...

  9. Linux 安装操作系统标准

    一.注意事项. 1.虚拟机安装不做过多介绍. 2.若为主机(非服务器)安装需要按照如下步骤: a.首先需要将u盘刻录pe系统然后设置开机引导为u盘启动后进入,将以前的硬盘分区全部删除. b.若主机bi ...

  10. vue-router填坑之路

    1.在结构化css时,习惯将不同的css文件通过一个入口文件打包,而入口文件在引入其他css文件时,需要强烈注意,要在单行末尾加分号: 少分号的,单行相对应的css文件会引用无效 @import '. ...