在WebAPI 使用Session

在WebAPI 使用Session

最近在改寫WebApp時要將以前用泛型處理常式寫的Captcha 改成使用WebApi 來實作機制,在實作的過程中發現使用IRequiresSessionState session也無法使用(context.Session==null)

查過一些文章才發現需要在註冊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 改成

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();
        
        }

最後來看一下成果

sshot-1

12/17 發現在sessionstate=InProc 時是可以正常work 但使用SQLServer就會有遺失狀況,正在解決中