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