c#在WebAPI使用Session的方法
最近在改寫(xiě)WebApp時(shí)要將以前用泛型處理例程寫(xiě)的Captcha 改成使用WebApi 來(lái)實(shí)作機(jī)制,在實(shí)作的過(guò)程中發(fā)現(xiàn)使用IRequiresSessionState session也無(wú)法使用(context.Session==null)
查過(guò)一些文章才發(fā)現(xiàn)需要在注冊(cè)api路由需將RouteHandler 改寫(xiě),才能使用。以下用ASP.net MVC 4來(lái)說(shuō)明要實(shí)作的部分
建立HttpControllerHandler和HttpControllerRouteHandler 并覆寫(xiě)它
public class SessionRouteHandler : HttpControllerHandler, IRequiresSessionState { public SessionRouteHandler(RouteData routeData) : base(routeData) { } } public class SessionControllerRouteHandler : HttpControllerRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { return new SessionRouteHandler(requestContext.RouteData); } }
在WebApiConfig中將config.Routes.MapHttpRoute 改成
RouteTable.Routes.MapHttpRoute(using System.Web.Routing)并指定RouteHandler
public static void Register(HttpConfiguration config) { RouteTable.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ).RouteHandler=new SessionControllerRouteHandler(); }
或者 在MVC的WebApi中默認(rèn)是沒(méi)有開(kāi)啟Session會(huì)話支持的。需要在Global中重寫(xiě)Init方法來(lái)指定會(huì)話需要支持的類(lèi)型
public override void Init() { PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest; base.Init(); } void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) { HttpContext.Current.SetSessionStateBehavior( SessionStateBehavior.Required); }
或者:
public override void Init() { this.PostAuthenticateRequest += (sender, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); base.Init(); }
在默認(rèn)情況下是沒(méi)有開(kāi)啟的。SessionStateBehavior有四個(gè)值:
- Default使用默認(rèn)ASP.NET邏輯來(lái)確定請(qǐng)求的會(huì)話狀態(tài)行為。默認(rèn)邏輯是尋找IHttpHandler中是否存在標(biāo)記會(huì)話狀態(tài)接口。
- Disabled未啟用會(huì)話狀態(tài)來(lái)處理請(qǐng)求。 此設(shè)置將覆蓋已通過(guò)檢查請(qǐng)求的處理程序確定的任何會(huì)話行為。
- ReadOnly為請(qǐng)求啟用只讀會(huì)話狀態(tài)。這意味著會(huì)話狀態(tài)無(wú)法更新。此設(shè)置將覆蓋已通過(guò)檢查請(qǐng)求的處理程序確定的任何會(huì)話狀態(tài)行為。
- Required為請(qǐng)求啟用完全的讀寫(xiě)會(huì)話狀態(tài)行為。 此設(shè)置將覆蓋已通過(guò)檢查請(qǐng)求的處理程序確定的任何會(huì)話行為。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#如何通過(guò)probing指定dll尋找文件夾詳解
這篇文章主要給大家介紹了關(guān)于C#如何通過(guò)probing指定dll尋找文件夾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12WinForm實(shí)現(xiàn)為T(mén)extBox設(shè)置水印文字功能
這篇文章主要介紹了WinForm實(shí)現(xiàn)為T(mén)extBox設(shè)置水印文字功能,很實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-08-08C#實(shí)現(xiàn)TreeView節(jié)點(diǎn)拖拽的方法
這篇文章主要介紹了C#實(shí)現(xiàn)TreeView節(jié)點(diǎn)拖拽的方法,涉及C#針對(duì)TreeView節(jié)點(diǎn)的動(dòng)態(tài)添加及移除技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#控制臺(tái)程序中使用官方依賴注入的實(shí)現(xiàn)
這篇文章主要介紹了C#控制臺(tái)程序中使用官方依賴注入的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04C#實(shí)現(xiàn)鬧鐘AlarmClock實(shí)例代碼
這篇文章主要介紹了C#實(shí)現(xiàn)鬧鐘AlarmClock實(shí)例代碼,很實(shí)用的功能,需要的朋友可以參考下2014-08-08C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例
ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,可以用來(lái)存儲(chǔ)任意類(lèi)型的元素,本文就來(lái)介紹一下C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12