zoukankan      html  css  js  c++  java
  • Asp.Net Web API中使用Session,Cache和Application的几个方法

        在ASP.NET中,Web Api的控制器类派生于ApiController,该类与ASP.NET的Control类没有直接关系,因此不能像在Web MVC中直接使用HttpContext,Cache,Session等,要使用的话,一般是从System.Web.HttpContext.Current静态对象引用HttpContext,从而使用Session等状态数据。

        不过,要在控制器类中通过HttpContext的Session属性直接使用Session状态数据,将抛出nullreference异常,网查主要有两种解决方案,一个是重载Global的init()方法,在该方法中开放Session状态,另一个设计带Session的路由处理器

        重载Global的Init()

    public class WebApiApplication : System.Web.HttpApplication
    {
            public override void Init()
            {
                this.PostAuthorizeRequest += (y, z) => HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
                base.Init();
            }
            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
    }

    设计路由处理器

      建立HttpControllerHandler和HttpControllerRouteHandler并覆写

     public class SessionStateRouteHandler : IRouteHandler
      {
            public IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                return new SessionableControllerHandler(requestContext.RouteData);
            }
     }
     public class SessionableControllerHandler:HttpControllerHandler,IRequiresSessionState
     {
            public SessionableControllerHandler(RouteData routeData)
                :base(routeData)
            {
    
            }
     }

       创建RouteConfig类型并配置路由

     public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection route)
            {
                route.MapHttpRoute(
                  name: "WebApiRoute1",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
                ).RouteHandler = new SessionStateRouteHandler();
            }
        }

     在Global中注册配置

    protected void Application_Start()
    {
                // GlobalConfiguration.Configure(WebApiConfig.Register);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
  • 相关阅读:
    HDU4652 Dice
    CF113D Museum / BZOJ3270 博物馆
    SHOI2013 超级跳马
    最基本的卷积与反演
    NOI2014 动物园题解
    SP11414 COT3
    new to do
    linux C++中宏定义的问题:error: unable to find string literal operator ‘operator""fmt’ with ‘const char [4]’, ‘long unsigned int’ arguments
    新装vs2010的问题:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    windows下删除虚拟串口的方法,以及解决串口使用中,无法变更设备串口号的问题
  • 原文地址:https://www.cnblogs.com/yan7/p/7800122.html
Copyright © 2011-2022 走看看