C# WebApi的controller中如何存取session


在MVC以后,Session方式可能已經不太常用,但偶爾還是會用到,比如頁面驗證碼之類的。例如登錄頁面使用的驗證碼通過Controller提供一個View來實現,可以使用Session來存儲這個值。但現在常用的請求都可以交給WebApi來處理,按照默認方式架設的MVC4的應用中,WebApi是取不到由Controller保存的Session值的,那么,我們需要進行一定的配置。記錄如下:

第一步:簡單建立兩個類,以備修改WebApi的路由方式

第一個類SessionRouteHandler,繼承自HttpControllerHandler,並同時實現一下IRequiresSessionState接口,其實IRequiresSessionState是沒有內部方法的,因此也不需要寫啥。

1 public class SessionRouteHandler : HttpControllerHandler,IRequiresSessionState 2 {
3         public SessionRouteHandler(RouteData routeData) : base(routeData)
4         {
5         }
6 }

第二個類SessionControllerRouteHandler,繼承自HttpControllerRouteHandler

復制代碼
1 public class SessionControllerRouteHandler : HttpControllerRouteHandler 2 {
3         protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
4         {
5             return new SessionRouteHandler(requestContext.RouteData);
6         }
7 }
復制代碼

完成這兩個類之后,就可以進行下一步了。

第二步:修改WebApiConfig,給新手提示一下,這個類在Global中可以看到,WebApiConfig.Register(......這里在進行的。一般情況下,在App_Start目錄下。由於我們是要讓WebApi能獲得MVC中Controller中設置的Session,故要重改一下這個配置。

復制代碼
 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.asax.cs代碼中,重載它的Init方法,加入如下代碼:

1 public override void Init()
2 {
3      PostAuthenticateRequest += (s, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
4      base.Init();
5 }

好了,全部完成后可以編譯了,這時候,你可以在Controller中按照正常方式建立Session了,例如:

Session["ValidCode"]="Session Test"

那么WebApi中就可以獲取到了:

HttpContext.Current.Session["ValidCode"].ToString()


免責聲明!

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



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