2011-11-15 7 views
3

私は要求に応じて後処理を行うカスタムHTTPモジュールを持っています。この処理は、PostRequestHandlerExecuteイベント中に実行され、SessionStateを変更します。Response.End()の呼び出しの後のセッションへのアクセス

私は独自のコールバックメカニズムを実装しているサードパーティのコントロールを持っています。基本的に、コンポーネントはResponse.End()を呼び出した後、コントロールのRenderイベントでXMLをバッファにレンダリングしています。

Response.End()を呼び出すため、パイプライン内の他のイベントは発生しません。私はこの後処理コードを実行するために私のカスタムモジュールを取得する方法を理解しようとしています。私はEndRequestイベントにフックできますが、この時点でセッションは利用できなくなりました。

編集 具体的には、セッション状態の2つの特定のスロットの値を変更する必要があります。 1つは値型であり、1つは参照型です。私はまたInProcessセッション状態を使用しています アイデアや提案はありますか?

答えて

2

Response.End(どちらも代わりにHttpApplication.CompleteRequestを使用することを推奨します)では、アプリケーションイベントを短絡しますが、セッションステートモジュールは終了要求時にセッション状態を維持します。セッションステートモジュールがセッションステートを保持するたびに、セッションバッグをコンテキストから削除します。

これを行うためのハック方法の1つは、あなたのモジュールにフラグを設定することです。 PostRequestHandlerExecuteが発生した場合にフラグを設定します。 EndRequestを処理し、フラグが設定されていない場合は、セッション状態の操作に進みます。セッション状態を取得するには、web.config内のすべてのモジュールをクリアし、セッション状態モジュールの前にモジュールを配置します(モジュールは登録順にアプリイベントを受け取ります)。

クリーナーはあなたのown session state store providerを持っているでしょう - あなたのモジュールでセッションスロットを操作するために使用されるセッションIDに基づいてセッション状態バッグを取得する方法を公開することができます。

+0

私は自分自身のセッション状態プロバイダを持っているのが好きです。実際の問題では、次の要求に対する処理を処理することでこれを解決しました。 (私は基本的にユーザーのコンテキストを変更していますので、変更を取り消す必要がありますので、コンテキストが変更された状態にあるかどうかを確認してください)。しかし、私は自分のプロバイダをローリングする考えが好きです – JoshBerke

関連する問題