您的位置:首页 > 编程语言 > ASP

[翻译]创建ASP.NET WebApi RESTful 服务(9)

2014-04-14 15:28 429 查看
一旦成功的发布API后,使用者将依赖于你所提供的服务。但是变更总是无法避免的,因此谨慎的制定ASP.NETWebAPI的版本策略就变得非常重要。一般来说,新的功能需要无缝的接入,有时新老版本需要并行,以便给使用者足够的时间来进行迁移和配套的变更。设置,老的版本会一直持续被使用。

简单版本管理

假设我们现在对StudentsController进行修改,将GET方法中返回“FirstName”和“LastName”修改为返回“FullName”和“CoursesDuration”。

最简单的方法就是新建一个类似于StudentsV2Controller的新服务。请留意V2,接下来将依赖这个引入管理策略。这种方法来自于ShawnWildermuth的pluralsightcourse文章。旧版本的服务返回的json应该是这样的:

[{
"id":2,
"url":"http://localhost:8323/api/students/HasanAhmad",
"firstName":"Hasan",
"lastName":"Ahmad",
"gender":0,
"enrollmentsCount":4
},
{
"id":3,
"url":"http://localhost:8323/api/students/MoatasemAhmad",
"firstName":"Moatasem",
"lastName":"Ahmad",
"gender":0,
"enrollmentsCount":4
}]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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;}

而新版本的返回如下:

[{
"id":2,
"url":"http://localhost:8323/api/students/HasanAhmad",
"fullName":"HasanAhmad",
"gender":0,
"enrollmentsCount":4,
"coursesDuration":13
},
{
"id":3,
"url":"http://localhost:8323/api/students/MoatasemAhmad",
"fullName":"MoatasemAhmad",
"gender":0,
"enrollmentsCount":4,
"coursesDuration":16
}]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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函数的实现为:

publicIEnumerable<StudentV2BaseModel>Get(intpage=0,intpageSize=10)
{
IQueryable<Student>query;
query=TheRepository.GetAllStudentsWithEnrollments().OrderBy(c=>c.LastName);
vartotalCount=query.Count();
vartotalPages=Math.Ceiling((double)totalCount/pageSize);
varurlHelper=newUrlHelper(Request);
varprevLink=page>0?urlHelper.Link("Students",new{page=page-1,pageSize=pageSize}):"";
varnextLink=page<totalPages-1?urlHelper.Link("Students",new{page=page+1,pageSize=pageSize}):"";
varpaginationHeader=new
{
TotalCount=totalCount,
TotalPages=totalPages,
PrevPageLink=prevLink,
NextPageLink=nextLink
};
System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));
varresults=query
.Skip(pageSize*page)
.Take(pageSize)
.ToList()
.Select(s=>TheModelFactory.CreateV2Summary(s));
returnresults;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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只是为了举例方便,实际可以根据需要是否要进行这样的修改或者无须修改。

具体的代码如下:

publicclassStudentV2BaseModel
{
publicintId{get;set;}
publicstringUrl{get;set;}
publicstringFullName{get;set;}
publicData.Enums.GenderGender{get;set;}
publicintEnrollmentsCount{get;set;}
publicdoubleCoursesDuration{get;set;}
}
publicclassModelFactory
{
publicStudentV2BaseModelCreateV2Summary(Studentstudent)
{
returnnewStudentV2BaseModel()
{
Url=_UrlHelper.Link("Students",new{userName=student.UserName}),
Id=student.Id,
FullName=string.Format("{0}{1}",student.FirstName,student.LastName),
Gender=student.Gender,
EnrollmentsCount=student.Enrollments.Count(),
CoursesDuration=Math.Round(student.Enrollments.Sum(c=>c.Course.Duration))
};
}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: