1

Web の要求応答の性質が本質的にステートレスであることを考えると、HttpContext がどのように維持されるのか疑問に思っています。

HttpRuntime クラスがリクエスト (HttpWorkerRequest) からこのセクションを読み取って HttpContext クラスを作成できるように、__E​​VENTTarget / __EVENTARGUMENTS 隠しフィールドの一部として送信される HttpContext オブジェクトの識別子ですか? 思わない

http パイプラインに関する理解の穴を埋めようとしているのですが、これに関する情報を見つけることができませんでした。

HttpContext.Current.Session["myKey"] = Value; のようなものを理解しています。

ただ動作しますが、別の言語 (perl など) で同様のことを行う必要がある場合は、同じために隠しフィールドを使用する必要がありますね。

ありがとう -ヴェヌ

4

2 に答える 2

6

HttpContextは、リクエストごとに再作成されます。ただし、HttpSessionは、リクエスト間でサーバーに保存されます。基本的に、HttpSessionはDictionary <string、Dictionary <string、object>>です。初期キーであるセッションIDは、Cookieまたはクエリ文字列パラメーター(Cookieのないセッションを使用している場合)のいずれかによって提供されます。Fiddlerを使用する場合は、そのユーザーのセッションのキーを含むASP.NET_SessionIdCookieが表示されます。

コード内:

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なしのセッションも処理されますが、基本的な考え方は同じです。

于 2008-11-07T19:04:52.410 に答える
0

HttpContext 傘下のすべてが同じように機能するとは思わないため、あなたの質問に対する答えは 1 つではないと思います。選択した例のセッション状態では、キーと値の両方がサーバー側に保存されます。将来のリクエストをそのセッション状態に接続する方法を知る方法は、(まったく異なる) キーを持つ Cookie を使用することです。ブラウザーが別の要求を行うと、要求と共にこの Cookie が送信され、サーバーはそれを使用して、どのセッションにマップするかを判断します。それが理解されると、応答全体で再び辞書にアクセスできるようになります。

したがって、perl でこれを行うには、Cookie を手動で作成してその中に一意のキーを保存し、それらの一意のキーをサーバー側でセッション状態辞書にマッピングし、上で説明したことのほとんどを行う必要があります。

于 2008-11-07T18:47:08.140 に答える