在MVC之後,Session方式可能已經不太經常使用,但偶爾仍是會用到,好比頁面驗證碼之類的。例如登陸頁面使用的驗證碼經過Controller提供一個View來實現,可使用Session來存儲這個值。但如今經常使用的請求均可以交給WebApi來處理,按照默認方式架設的MVC4的應用中,WebApi是取不到由Controller保存的Session值的,那麼,咱們須要進行必定的配置。記錄以下:api
第一步:簡單創建兩個類,以備修改WebApi的路由方式ide
第一個類SessionRouteHandler,繼承自HttpControllerHandler,並同時實現一下IRequiresSessionState接口,其實IRequiresSessionState是沒有內部方法的,所以也不須要寫啥。ui
1 public class SessionRouteHandler : HttpControllerHandler,IRequiresSessionState 2 { 3 public SessionRouteHandler(RouteData routeData) : base(routeData) 4 { 5 } 6 }
第二個類SessionControllerRouteHandler,繼承自HttpControllerRouteHandlerspa
1 public class SessionControllerRouteHandler : HttpControllerRouteHandler 2 { 3 protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 4 { 5 return new SessionRouteHandler(requestContext.RouteData); 6 } 7 }
完成這兩個類以後,就能夠進行下一步了。code
第二步:修改WebApiConfig,給新手提示一下,這個類在Global中能夠看到,WebApiConfig.Register(......這裏在進行的。通常狀況下,在App_Start目錄下。因爲咱們是要讓WebApi能得到MVC中Controller中設置的Session,故要重改一下這個配置。blog
1 public static class WebApiConfig 2 { 3 public static void Register(HttpConfiguration config) 4 { 5 //config.Routes.MapHttpRoute( 6 // name: "DefaultApi", 7 // routeTemplate: "api/{controller}/{id}", 8 // defaults: new { id = RouteParameter.Optional } 9 //); 10 //Route上傳遞Session 11 RouteTable.Routes.MapHttpRoute( 12 name: "DefaultApi", 13 routeTemplate: "api/{controller}/{id}", 14 defaults: new {id = RouteParameter.Optional}).RouteHandler = new SessionControllerRouteHandler(); 15 } 16 }
這裏從RouteTable直接配置,並指定了RouteHandler爲咱們第一步創建的SessionControllerRouteHandler。但這些工做都作了,Session的傳遞仍是會不成功的,由於這裏咱們要指定一下Behavior。繼承
第三步:修改Global。接口
在Global的cs代碼中,重載它的Init方法,代碼以下:路由
1 public override void Init() 2 { 3 PostAuthenticateRequest += (s, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); 4 base.Init(); 5 }
好了,所有完成後能夠編譯了,這時候,你能夠在Controller中按照正常方式創建Session了,例如:it
Session["ValidCode"]="Session Test"
那麼WebApi中就能夠獲取到了:
HttpContext.Current.Session["ValidCode"].ToString()
本篇完結