28

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

削除したい API 呼び出しの後にセッション セットを実行するジェネリック ハンドラーがあります。

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

2 に答える 2

51

技術的には、はい。ただし、この慣行には反対することをお勧めしますが、REST API は完全にステートレスにする必要があります (Cookie やその他のクライアント側の状態は問題ありません)。

絶対にこれを行う必要がある場合は、次のように HTTP コンテキストを取得できます。

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

その時点で、そのSessionプロパティを使用してセッションを取得します。

これは、によって想定されている特定の契約を破ることに注意してSystem.Net.Httpください。具体的には、API コントローラーは ASP.NET に結合されているため、自己ホストできないことを意味します。これに問題がなく、分散セッションを使用するようにすべてを再構築しない限り、API コントローラーが Web ファームから適切に機能しない可能性があるという事実に問題がない場合は、それを実行してください。

PS も使用IRequiresSessionStateできますが、コントローラー自体では使用できません。 で使用し、HttpControllerHandlerとして設定する必要がありますRouteHandler。このアプローチについては、この MSDN スレッドで説明されています。繰り返しますが、この考えを強く推奨することはできません。これは Web API の基本原則に違反していますが、本当に正当な理由がある場合は、もう少し再利用可能な別のオプションです。

于 2013-11-10T00:15:25.173 に答える
18

Web Api 2.1 を使用している場合、HttpContext としてキャストしてもうまくいきませんでした。ただし、HttpContextWrapper を使用できます。

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;
于 2014-06-13T19:32:47.950 に答える