Question

Je me demande comment le HttpContext est maintenu étant donné que la nature demande-réponse du Web est essentiellement sans état.

Un identifiant pour l'objet HttpContext est-il envoyé dans le cadre des champs masqués __EVENTTarget / __EVENTARGUMENTS afin que la classe HttpRuntime puisse créer la classe HttpContext en lisant cette section à partir de la demande (HttpWorkerRequest)? Je ne pense pas

Faites-moi savoir, car j'essaie de combler certaines lacunes dans ma compréhension du pipeline http et que je n'ai trouvé aucune information à ce sujet.

Je comprends quelque chose comme HttpContext.Current.Session [& Quot; myKey & Quot;]] = valeur;

fonctionne, mais si je devais faire quelque chose de similaire dans une langue différente (disons perl), je devrais utiliser des champs cachés pour la même chose, n'est-ce pas?

Merci -Venu

Était-ce utile?

La solution

Le HttpContext est recréé pour chaque demande. La session HttpSession, cependant, est stockée sur le serveur lors de demandes. Fondamentalement, HttpSession est un dictionnaire & Lt; chaîne, Dictionnaire & Lt; chaîne, objet & Gt; & Gt ;. La clé initiale, l'identifiant de session, est fournie par un cookie ou un paramètre de chaîne de requête (si vous utilisez des sessions sans cookie). Si vous utilisez Fiddler, le cookie ASP.NET_SessionId contient la clé de la session de cet utilisateur.

Dans le code:

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;
   }
}

L’implémentation réelle gère également les délais d’expiration de session, les abandons et les sessions sans cookies, mais l’idée de base est la même.

Autres conseils

Je ne pense pas qu'il y ait une réponse à votre question, parce que je ne pense pas que tout sous l'ombrelle HttpContext fonctionne de la même manière. Dans l'exemple que vous avez choisi, état de la session, la clé et la valeur sont stockées côté serveur. Il sait comment associer les futures demandes à cet état de session en utilisant un cookie contenant une clé (totalement différente). Lorsque le navigateur fait une autre demande, il envoie ce cookie avec la demande et le serveur l'utilise pour déterminer la session à mapper. Une fois que tout est compris, vous avez à nouveau accès à votre dictionnaire, quelle que soit la réponse.

Donc, pour le faire en Perl, vous voudriez créer manuellement un cookie et y stocker une clé unique, avoir un mappage côté serveur de ces clés uniques dans les dictionnaires d'état de session et faire à peu près ce que j'ai décrit ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top