[翻译]创建ASP.NET WebApi RESTful 服务(9)
一旦成功的发布API后,使用者将依赖于你所提供的服务。但是变更总是无法避免的,因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要。一般来说,新的功能需要无缝的接入,有时新老版本需要并行,以便给使用者足够的时间来进行迁移和配套的变更。设置,老的版本会一直持续被使用。
简单版本管理
假设我们现在对StudentsController进行修改,将GET方法中返回“FirstName” 和 “LastName”修改为返回“FullName”和 “CoursesDuration”。
最简单的方法就是新建一个类似于StudentsV2Controller的新服务。请留意V2,接下来将依赖这个引入管理策略。这种方法来自于Shawn Wildermuth的plural sight course文章。旧版本的服务返回的json应该是这样的:
1: [{
2: "id": 2,
3: "url": "http://localhost:8323/api/students/HasanAhmad",
4: "firstName": "Hasan",
5: "lastName": "Ahmad",
6: "gender": 0,
7: "enrollmentsCount": 4
8: },
9: {
10: "id": 3,
11: "url": "http://localhost:8323/api/students/MoatasemAhmad",
12: "firstName": "Moatasem",
13: "lastName": "Ahmad",
14: "gender": 0,
15: "enrollmentsCount": 4
16: }]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
而新版本的返回如下:
1: [{
2: "id": 2,
3: "url": "http://localhost:8323/api/students/HasanAhmad",
4: "fullName": "Hasan Ahmad",
5: "gender": 0,
6: "enrollmentsCount": 4,
7: "coursesDuration": 13
8: },
9: {
10: "id": 3,
11: "url": "http://localhost:8323/api/students/MoatasemAhmad",
12: "fullName": "Moatasem Ahmad",
13: "gender": 0,
14: "enrollmentsCount": 4,
15: "coursesDuration": 16
16: }]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
新版本的GET函数的实现为:
1: public IEnumerable<StudentV2BaseModel> Get(int page = 0, int pageSize = 10)
2: {
3: IQueryable<Student> query;
4:
5: query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName);
6:
7: var totalCount = query.Count();
8: var totalPages = Math.Ceiling((double)totalCount / pageSize);
9:
10: var urlHelper = new UrlHelper(Request);
11: var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : "";
12: var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : "";
13:
14: var paginationHeader = new
15: {
16: TotalCount = totalCount,
17: TotalPages = totalPages,
18: PrevPageLink = prevLink,
19: NextPageLink = nextLink
20: };
21:
22: System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
23: Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));
24:
25: var results = query
26: .Skip(pageSize * page)
27: .Take(pageSize)
28: .ToList()
29: .Select(s => TheModelFactory.CreateV2Summary(s));
30:
31: return results;
32: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
StudentV2BaseModel和CreateV2Summary只是为了举例方便,实际可以根据需要是否要进行这样的修改或者无须修改。
具体的代码如下:
1: public class StudentV2BaseModel
2: {
3: public int Id { get; set; }
4: public string Url { get; set; }
5: public string FullName { get; set; }
6: public Data.Enums.Gender Gender { get; set; }
7: public int EnrollmentsCount { get; set; }
8: public double CoursesDuration { get; set; }
9: }
10:
11: public class ModelFactory
12: {
13: public StudentV2BaseModel CreateV2Summary(Student student)
14: {
15: return new StudentV2BaseModel()
16: {
17: Url = _UrlHelper.Link("Students", new { userName = student.UserName }),
18: Id = student.Id,
19: FullName = string.Format("{0} {1}", student.FirstName, student.LastName),
20: Gender = student.Gender,
21: EnrollmentsCount = student.Enrollments.Count(),
22: CoursesDuration = Math.Round(student.Enrollments.Sum(c => c.Course.Duration))
23: };
24: }
25: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
来源:http://bitoftech.net/2013/12/16/asp-net-web-api-versioning-strategy/
[翻译]创建ASP.NET WebApi RESTful 服务(9)的更多相关文章
- [翻译]创建ASP.NET WebApi RESTful 服务(8)
本章讨论创建安全的WebApi服务,到目前为止,我们实现的API都是基于未加密的HTTP协议,大家都知道在Web中传递身份信息必须通过HTTPS,接下来我们来实现这一过程. 使用HTTPS 其实可以通 ...
- [翻译]创建ASP.NET WebApi RESTful 服务(11)
本章介绍通过使用Ali Kheyrollahi开发的CacheCow来实现服务器端的缓存.所有代码现在都可以在GitHub上下载. 我们将要实现的缓存方式叫做Conditional Requests, ...
- [翻译]创建ASP.NET WebApi RESTful 服务(7)
实现资源分页 本章我们将介绍几种不同的结果集分页方式,实现手工分页,然后将Response通过两个不同的方式进行格式化(通过Response的Envelop元数据或header). 大家都知道一次查询 ...
- [翻译]创建ASP.NET WebApi RESTful 服务(10)
通过URI实现版本管理 另一种实现版本管理的方式就是通过URI来进行处理,类似于http://localhost:{your_port}/api/v1/students/.这种方式的好处是使用者可以清 ...
- IIS 部署ASP.Net, WebAPI, Restful API, PUT/DELETE 报405错解决办法, webapi method not allowed 405
WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...
- Asp.net WebAPi Restful 的实现和跨域
现在实际开发中用webapi来实现Restful接口开发很多,我们项目组前一段时间也在用这东西,发现大家用的还是不那么顺畅,所以这里写一个Demo给大家讲解一下,我的出发点不是如何实现,而是为什么? ...
- 在windows10上创建ASP.NET mvc5+Memcached服务
感谢两位两位大佬: https://blog.csdn.net/l1028386804/article/details/61417166 https://www.cnblogs.com/running ...
- ASP.NET WebAPI 双向token实现对接小程序登录逻辑
最近在学习用asp.net webapi搭建小程序的后台服务,因为基于小程序端和后台二者的通信,不像OAuth(开放授权),存在第三方应用.所以这个token是双向的,一个是对用户的,一个是对接口的. ...
- [03-2]VS2017 创建 ASP.NET Core Web 程序
VS2017 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...
随机推荐
- Struts2 原理
.Struts2原理 .Struts 1 原理 .Struts1 和webwork的关系 .HttpServletRequest Struts2原理
- BZOJ 1803 Query on a tree III
树上主席树. 我靠这是第k小吧..... #include<iostream> #include<cstdio> #include<cstring> #includ ...
- 对于fmri的设计矩阵构造的一个很直观的解释-by 西南大学xulei教授
本程序意在解释这样几个问题:完整版代码在本文的最后. 1.实验的设计如何转换成设计矩阵? 2.设计矩阵的每列表示一个刺激条件,如何确定它们? 3.如何根据设计矩阵和每个体素的信号求得该体素对刺激的敏感 ...
- swun 1766 我的悲剧不可能那么好数
解题思路: 一向提交特别慎重的我,这题竟然PE了5发左右,放了几天,再回来写,直接1A, 相当的自豪,而且是最优解题者.这题千万要注意,化繁为简,文章只包括大小 写字母和数字,还有空行. #inc ...
- Excel学习笔记杂荟
Excel学习 一.工具->选项 可以对整个excel里面的东西进行编辑,里面有隐藏行号,下拉档等选项,有文档作者信息. 隐藏网格等 二.单元格内容比较大可以右击单元格->设置单元格格式- ...
- Heritrix源码分析(四) 各个类说明(转)
Heritrix的类的确很繁琐,往往继承了一层又一层,最多的继承好像有7层.下面就一个包一个包的说明每个类的作用,由于里面Heritrix组件分明,很多组件没用到的同时该组件的类我也没怎么接触,所以这 ...
- java-No exception of type ConfigurationException can be thrown; an exception type must be a subclass of Throwable
功能:读配置文件 java菜鸟:导入工程在报名处就开始报错,第一次遇到 import org.apache.commons.lang3.StringUtils; import org.apache.c ...
- 有趣的js题目
([]).length ({}).length // undefined ([] + {}).length ({} + {}).length 具体解释见此.
- MySQL与Oracle 差异比较之六触发器
触发器 编号 类别 ORACLE MYSQL 注释 1 创建触发器语句不同 create or replace trigger TG_ES_FAC_UNIT before insert or upd ...
- 解析AFNetWorking 网络框架(一)
转:http://blog.csdn.net/andy_jiangbin/article/details/17103041 一直忙于工作,需要资料在网上找到就转发在博客里,今天自己也贡献一点微薄的力量 ...