在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

相关文章
相关标签/搜索