在WebAPI使用Session

最近在改寫WebApp時要將之前用泛型處理例程寫的Captcha 改爲使用WebApi 來實做機制,在實做的過程當中發現使用IRequiresSessionState session也沒法使用(context.Session==null)web

 
查過一些文章才發現須要在註冊api路由需將RouteHandler 改寫,才能使用。如下用 ASP.net MVC 4來講明要實做的部分
 
創建HttpControllerHandler和HttpControllerRouteHandler 並覆寫它
 
    public class SessionRouteHandler : HttpControllerHandler, IRequiresSessionState
    {
        public SessionRouteHandler(RouteData routeData) : base(routeData)
        {

        }
    }

    public class SessionControllerRouteHandler : HttpControllerRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {

            return new SessionRouteHandler(requestContext.RouteData);

        }

    }

 

在WebApiConfig中將config.Routes.MapHttpRoute 改爲api

 
RouteTable.Routes.MapHttpRoute(using System.Web.Routing)並指定RouteHandler
 
public static void Register(HttpConfiguration config)
{
   RouteTable.Routes.MapHttpRoute(

   name: "DefaultApi",

   routeTemplate: "api/{controller}/{id}",

   defaults: new { id = RouteParameter.Optional }

   ).RouteHandler=new SessionControllerRouteHandler();
}

 

或者 在MVC的WebApi中默認是沒有開啓Session會話支持的。須要在 Global中重寫Init方法來指定會話須要支持的類型
 
public override void Init()
        {
            PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
            base.Init();
        }

        void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
        {
            HttpContext.Current.SetSessionStateBehavior(
                SessionStateBehavior.Required);
        }

或者:session

        public override void Init()
        {
            this.PostAuthenticateRequest += (sender, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
            base.Init();
        }

 

 

在默認狀況下是沒有開啓的。SessionStateBehavior有四個值:ide

 

Default使用默認ASP.NET邏輯來肯定請求的會話狀態行爲。默認邏輯是尋找IHttpHandler中是否存在標記會話狀態接口。

Disabled未啓用會話狀態來處理請求。 此設置將覆蓋已經過檢查請求的處理程序肯定的任何會話行爲。ui

ReadOnly爲請求啓用只讀會話狀態。這意味着會話狀態沒法更新。此設置將覆蓋已經過檢查請求的處理程序肯定的任何會話狀態行爲。this

Required爲請求啓用徹底的讀寫會話狀態行爲。 此設置將覆蓋已經過檢查請求的處理程序肯定的任何會話行爲。spa

相關文章
相關標籤/搜索