MVC4+WebApi+Redis Session共享練習(上)


這幾天生病了,也沒有心情寫博客,北京醫院真心傷不起呀,錢不少花,病沒治好,還增加了新病,哎不說了,周末還得去大醫院檢查一下,趁女盆友還沒有回來,把前幾天寫的東西總結一下。本文也會接觸一點webApi的東東,自己最近也一直在看,算是入門了吧。本文用到的知識點有MVC4、knockout.jsEntityFramework、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入門講解)

本文主要實現以下功能:

  1. MVCweb程序與WebApi實現數據通信及Session共享(兩個分部署)
  2. MVC過濾器及錯誤捕捉
  3. Redis緩存操作

通過一個學生信息的管理來實現該項目。本人對webApi也是入門級別,如果過得不對的歡迎指正,也歡迎分享學習資料。

1、我們先介紹一下WebApi項目,項目結構如下圖

  1. 其中Common項目為自定義的Session,詳細請參見http://www.cnblogs.com/lc-chenlong/p/3221003.html
  2. MvcWebApi要引用Common項目
  3. MvcWebApi項目 ValuesController.cs為數據的增刪改查及Redis緩存操作
  4. DbHelper.cs為我們的數據庫上下文
  5. 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; }
    }
}
View Code

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;
        }
    }
}
View Code

 

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。源代碼下一篇寫完奉上。

每天學習一點點,每天進步一點點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM