zoukankan      html  css  js  c++  java
  • 在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();
    }
    或者 在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);
            }

    或者:

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

    在默认情况下是没有开启的。SessionStateBehavior有四个值:

    Default使用默认ASP.NET逻辑来确定请求的会话状态行为。默认逻辑是寻找IHttpHandler中是否存在标记会话状态接口。

    Disabled未启用会话状态来处理请求。 此设置将覆盖已通过检查请求的处理程序确定的任何会话行为。

    ReadOnly为请求启用只读会话状态。这意味着会话状态无法更新。此设置将覆盖已通过检查请求的处理程序确定的任何会话状态行为。

    Required为请求启用完全的读写会话状态行为。 此设置将覆盖已通过检查请求的处理程序确定的任何会话行为。

     
  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/tinya/p/4563641.html
Copyright © 2011-2022 走看看