在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();
}
最後來看一下成果
12/17 發現在sessionstate=InProc 時是可以正常work 但使用SQLServer就會有遺失狀況,正在解決中