今天作項目的時候由於須要編寫一個短信驗證碼的接口我須要在個人後臺.net webapi中存入我隨機生成的短信驗證碼方便與前端傳遞過來的數據對比,因此決定使用session作緩存。可是沒想到的是我調用都是都是爲空的。讓後在網上找了下緣由是由於Web Api的控制器類派生自ApiControll它只繼承了IHttpController, IDisposable這兩個接口,與 MVC Controll類沒有直接關係,所以不能像在ASPX.CS代碼隱藏類中直接使用HttpContext、HttpApplicationState或HttpSessionState等狀態數據。要使用的話,通常是從System.Web.HttpContext.Current靜態對象引用HttpContext,從而使用Session等狀態數據。因此接下來咱們須要作的是重寫Global.asax中的方法,經過路由重寫啓用WEB API 中的session會話。前端
public static class WebApiConfig { public static string UrlPrefix { get { return "api"; } } /// <summary> /// 配合Gloabl.cs項目啓動時默認調用 /// </summary> public static string UrlPrefixRelative { get { return "~/api"; } } public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultAreaApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); //設置路由獲取調轉方式 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
public class MvcApplication : System.Web.HttpApplication { /// <summary> /// 開始session會話 /// </summary> protected void Application_PostAuthorizeRequest() { if (IsWebApiRequest()) { HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); } } /// <summary> /// 匹配WebApiconfig自定義路由規格 /// </summary> /// <returns></returns> private bool IsWebApiRequest() { return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative); } }