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);
    }
  • 相关阅读:
    基于CodeSmith的三层架构代码模板
    全自动时代:JavaScript自动压缩插件
    NServiceBus最流行的开源企业服务总线 for .Net
    神奇的东西
    WebMatrix
    .Net TDD我用Machine.Specification
    JQuery Smart UI 简介(四) — 强大的适用性&存在问题【项目使用性介绍】
    JQuery Smart UI 简介(三)
    JQuery Smart UI 简介(二)
    基于WCF大型分布式系统的架构设计
  • 原文地址:https://www.cnblogs.com/yan7/p/7800122.html
Copyright © 2011-2022 走看看