2013-11-09 12 views
25

WebAPIを介してHttpContext.Current.Sessionにアクセスできますか? IRequiresSessionを継承することはできますか?Web APIからHttpContext.Current.Sessionにアクセスすることは可能です

私は削除したいAPI呼び出しの後にセッションセットを行うジェネリックハンドラを持っています。

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

フォーム認証を使用するには、ほとんどの場合asp.netを設定する必要がありますが、それ以外の場合もあります。 –

+0

私はWebフォームを使用しています – Kubi

答えて

47

技術的、はい、私は本当にこのような行為に対して助言するだろうが - REST APIは完全にステートレスでなければなりません(クッキーや他のクライアント側の状態がOKです)。

あなたは絶対には、これを行う必要がある場合はそのように、あなたは、HTTPコンテキストをつかむことができます。あなただけのセッションを取得するために、そのSessionプロパティを使用してポイント

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

れます。

System.Net.Httpが引き受ける特定の契約が破られていることに注意してください。具体的には、APIコントローラはASP.NETに結合されているため自己ホストできません。これで問題ないのですが、分散セッションを使用するためにすべてを再構築しない限り、APIコントローラがウェブファームから正常に動作しない場合があります。

P.S. IRequiresSessionStateを使用することもできますが、コントローラ自体で使用することはできません。HttpControllerHandlerで使用し、RouteHandlerに設定する必要があります。このアプローチについては、this MSDN threadを参照してください。繰り返しますが、に対して強く推奨することはできません。これはWeb APIの基本原則に違反していますが、が本当にという理由がある場合はもう少しです再利用可能。

+0

誰もがこの警告を出しますが、権限を持つほぼすべてのwebapiは基本的にセッションと同じことをします...何らかのトークンを使用して、何かできるかどうかを示す既存の状態を見つけます。 (JWTのようなことは少し異なりますが、セキュリティ専門家からはそれほど嫌いです) –

14

Web Api 2.1を使用してHttpContextとしてキャストすることができませんでした。しかし、私はHttpContextWrapperを使うことができます。

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

これは動作しますが、Sessionパラメータはnullです。 – MyNameIsKo

関連する問題