天天看點

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);
}      
下一篇: 靜态檔案

繼續閱讀