在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); }