這幾天生病了,也沒有心情寫博客,北京醫院真心傷不起呀,錢不少花,病沒治好,還增加了新病,哎不說了,周末還得去大醫院檢查一下,趁女盆友還沒有回來,把前幾天寫的東西總結一下。本文也會接觸一點webApi的東東,自己最近也一直在看,算是入門了吧。本文用到的知識點有MVC4、knockout.js、EntityFramework、WebApi、Redis緩存及基於Redis緩存的Session共享,都是很基礎的操作,MVC我會介紹過濾器及錯誤捕捉,EntityFramework增刪改數據,WebApi做為數據通信以及Redis的基本緩存操作等。
如果你對這些知識還不太熟悉,請打開連接閱讀前幾篇文章。http://www.cnblogs.com/lc-chenlong/
本文參考:
http://www.cnblogs.com/artech/archive/2012/05/14/web-api-demo.html(蔣金楠)
http://www.cnblogs.com/rohelm/p/3195750.html(webAPI入門講解)
本文主要實現以下功能:
- MVCweb程序與WebApi實現數據通信及Session共享(兩個分部署)
- MVC過濾器及錯誤捕捉
- Redis緩存操作
通過一個學生信息的管理來實現該項目。本人對webApi也是入門級別,如果過得不對的歡迎指正,也歡迎分享學習資料。
1、我們先介紹一下WebApi項目,項目結構如下圖
- 其中Common項目為自定義的Session,詳細請參見http://www.cnblogs.com/lc-chenlong/p/3221003.html
- MvcWebApi要引用Common項目
- MvcWebApi項目 ValuesController.cs為數據的增刪改查及Redis緩存操作
- DbHelper.cs為我們的數據庫上下文
- Students.cs為學生實體類。
1.1、Students.cs實體類

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; namespace MvcWebApi.Models { [Table("tb_Students", Schema = "dbo")]//關聯數據表 dbo.tb_Students public class Students { [Key] public string Num { get; set; } [MaxLength(10),Required(ErrorMessage="姓名不能為空")] [Column(TypeName = "nvarchar")] public string Name { get; set; } public int Age { get; set; } [MaxLength(10)] [Column(TypeName = "varchar")] public string Sex { get; set; } [MaxLength(50)] public string Class { get; set; } } }
1.2、DbHelper.cs數據庫上下文
該文件主要定義數據庫的上下文,我對EF用的海曙不夠熟練,最近也一直在看,推薦一個人的博客,是一個EF學習的系列,講的還不錯。http://www.cnblogs.com/wlflovenet/archive/2011/12/30/EF11.html

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using System.Data.Entity.Migrations; namespace MvcWebApi.Models { public class DbHelper : DbContext { public DbHelper() : base("strConn") { //自動創建表,如果Entity有改到就更新到表結構 Database.SetInitializer<DbHelper>(new MigrateDatabaseToLatestVersion<DbHelper, ReportingDbMigrationsConfiguration>()); } public DbSet<Students> Students { get; set; } } internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<DbHelper> { public ReportingDbMigrationsConfiguration() { AutomaticMigrationsEnabled = true;//任何Model Class的修改將會直接更新DB AutomaticMigrationDataLossAllowed = true; } } }
1.3、ValuesController.cs數據操作控制器
在控制器中我們定義了增刪改查的基本方法,及Redis的操作,該控制器中只有Get()方法判斷了session是否為空,這里只是為了驗證一下session的值是否傳遞過來了。本知識點參照文章:http://www.cnblogs.com/newton/p/3238082.html
看代碼之前下介紹一下Redis的一個操作。1、Redise.AddEntityToList<Students>("stuList", stu);我們定義了一個緩存鍵位stuList的緩存列表,該緩存列表存儲的是Students實體,而不是把List<Students> stu存進去。2、Redise.AddEntityToList<Students>("stuList", stu);將單個stu對象存進緩存鏈表中。3、Redise.GetList<Students>("stuList")從緩存中獲取列表。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using MvcWebApi.Models; using Common; using System.Data; namespace MvcWebApi.Controllers { public class ValuesController : ApiController { SessionHelper session = new SessionHelper(); RedisHelper Redise = new RedisHelper(); // GET api/values public HttpResponseMessage Get() { //判斷session的值是否傳遞過來 if (session["user"] == null) { return Request.CreateResponse(HttpStatusCode.OK, new { type="error",data="session為空,清先登陸"}); }
//從stuList緩存鏈表獲取數據 var stuList = Redise.GetList<Students>("stuList"); if (stuList == null || stuList.Count()==0) { using (DbHelper db = new DbHelper()) { stuList = db.Students.ToList(); //創建stuList緩存鏈表 Redise.AddList<Students>("stuList", stuList); } } var data = new { type = "success", data = stuList }; return Request.CreateResponse(HttpStatusCode.OK, data); //db.Students.ToList(); } // GET api/values/5 public Students Get(string id) { Students stu = Redise.GetList<Students>("stuList").Where(it => it.Num == id).FirstOrDefault(); if (stu == null) { using (DbHelper db = new DbHelper()) { stu=db.Students.Where(it => it.Num == id).FirstOrDefault(); if (stu != null) { //向stuList緩存鏈表中添加實體 Redise.AddEntityToList<Students>("stuList", stu); } } } return stu; } // POST api/values public void Post([FromBody] Students stu) { } // PUT api/values/5 public HttpResponseMessage Put([FromBody] Students stu) { Students RedStu = Redise.GetList<Students>("stuList").Where(it => it.Num == stu.Num).FirstOrDefault(); Redise.RemoveEntityFromList<Students>("stuList", RedStu); Redise.AddEntityToList("stuList", stu); using (DbHelper db = new DbHelper()) { db.Entry(stu).State = EntityState.Modified; db.SaveChanges(); } return Request.CreateResponse(HttpStatusCode.OK, new { type = "success" }); } // DELETE api/values/5 public void Delete(int id) { } } }
介紹一下下面代碼返回的json數據格式
var data = new { type = "success", data = stuList }; return Request.CreateResponse(HttpStatusCode.OK, data);
數據格式為:
{"type":"success",data:[{},{},{}]}
今天就寫到這里吧。明天繼續寫MVC調用WebAPi。源代碼下一篇寫完奉上。
每天學習一點點,每天進步一點點