2013-11-09 117 views
25

訪問HttpContext.Current.Session是否有可能訪問HttpContext.Current.Session通過的WebAPI?我們可以讓它繼承IRequiresSession嗎?是否有可能從網絡API

我有一個通用的處理程序做一個會議,我想刪除API調用後設置。

public void AccountController : ApiController, IRequiresSessionState 
{ 
public void Login() 
{ 
setsession(){} 
} 
} 
+0

您很可能需要將asp.net設置爲使用表單身份驗證,儘管否則可能有可能。 –

+0

我使用Web窗體 – Kubi

回答

47

技術上,是的,但我真的建議反對這種做法 - 一個REST API應該是完全無狀態(cookies和其他客戶端的狀態是OK)。

如果你絕對必須此,你可以抓住的HTTP上下文,像這樣:

var context = Request.Properties["MS_HttpContext"] as HttpContext; 

此時你只需要使用它的Session屬性來獲取會話。

注意,這打破了由System.Net.Http承擔某些合同 - 具體地說,它意味着你的API控制器絕不可能自託管,因爲他們連接到ASP.NET。如果您確信這一點,並且事實上您的API控制器可能無法在網絡服務器場中正常運行,除非您重新設計所有使用分佈式會話的設計 - 那麼就去做吧。

P.S.也可以使用IRequiresSessionState,但不能在控制器本身上使用它,您需要在HttpControllerHandler上使用它並將其設置爲RouteHandler。該方法在this MSDN thread中討論。同樣,我不能強烈反對建議足夠這個想法,它違反了一個Web API的基本原則 - 但是,如果你已經有了一個真正很好的理由,那麼它的另一種選擇是多一點可重複使用的。

+0

每個人都給出了這樣的警告,但幾乎每一個有授權基本上的WebAPI做同樣的事情會話....它使用了一些象徵性的發現現有的狀態,說他們是否可以或不可以做什麼。 (像JWT這樣的事情有點不同,但是從安全專家那裏得到很多討厭的東西) –

14

鑄造它的HttpContext沒有我使用網絡API 2.1工作。但是我可以使用HttpContextWrapper。

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper; 
+7

這可以工作,但Session參數爲空。 – MyNameIsKo

相關問題