HttpContextは、要求と応答の間どのように維持されますか
-
07-07-2019 - |
質問
Webの要求と応答の性質は本質的にステートレスであるため、HttpContextがどのように維持されるのか疑問に思っています。
__ EVENTTarget / __EVENTARGUMENTS隠しフィールドの一部として送信されるHttpContextオブジェクトの識別子は、HttpRuntimeクラスがリクエスト(HttpWorkerRequest)からこのセクションを読み取ってHttpContextクラスを作成できるようにするためですか?思わない
httpパイプラインを理解する上でいくつかの穴を埋めようとしており、これに関する情報を見つけることができなかったため、お知らせください。
私は次のようなことを理解しています HttpContext.Current.Session [<!> quot; myKey <!> quot;] = Value;
機能しますが、別の言語(perlなど)で同様の操作を行う必要がある場合は、同じために非表示フィールドを使用する必要がありますか?
ありがとう -ヴェヌ
解決
HttpContextはリクエストごとに再作成されます。ただし、HttpSessionはリクエストをまたいでサーバーに保存されます。基本的に、HttpSessionは、Dictionary <!> lt; string、Dictionary <!> lt; string、object <!> gt; <!> gt;です。初期キーであるセッションIDは、Cookieまたはクエリ文字列パラメーター(Cookieなしのセッションを使用している場合)によって提供されます。 Fiddlerを使用すると、そのユーザーのセッションのキーを含むASP.NET_SessionId Cookieが表示されます。
コード内:
class HttpSessionState {
private static readonly Sessions =
new Dictionary<string, Dictionary<string, object>>();
public object this(string key) {
get {
return GetCurrentUserSession()[key]
}
set {
GetCurrentUserSession()[key] = value;
}
}
private Dictionary<string, object> GetCurrentUserSession() {
var id = GetCurrentUserSessionId[]
var d = Sessions[id];
if (d == null) {
d = new Dictionary<string, object>();
Sessions[id] = d;
}
return d;
}
private string GetCurrentUserSessionId() {
return HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value;
}
}
実際の実装では、セッションのタイムアウト、放棄、Cookieなしのセッションも処理されますが、基本的な考え方は同じです。
他のヒント
HttpContext傘下のすべてが同じように機能するとは思わないので、あなたの質問に1つの答えがあるとは思わない。選択したセッション状態の例では、キーと値の両方がサーバー側に保存されます。そのセッション状態への将来のリクエストをフックする方法を知る方法は、(まったく異なる)キーを持つCookieを使用することです。ブラウザが別のリクエストを行うと、ブラウザはこのCookieをリクエストとともに送信し、サーバーはそれを使用してどのセッションにマップするかを判断します。ひとたびそれが理解されると、応答全体にわたって辞書に再びアクセスできるようになります。
したがって、perlでそれを行うには、Cookieを手動で作成し、一意のキーをその中に保存し、それらの一意のキーをセッション状態辞書にサーバー側でマッピングし、私が説明したことをほとんど行います上記。