2008-11-07 8 views
1

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

L'identifiant de l'objet HttpContext envoyé dans le cadre des champs masqués __EVENTTarget/__EVENTARGUMENTS permet-il à la classe HttpRuntime de créer la classe HttpContext en lisant cette section à partir de la requête (HttpWorkerRequest)? Je ne pense pas

S'il vous plaît laissez-moi savoir que je suis en train de remplir quelques trous dans ma compréhension du pipeline http et je n'ai pas pu trouver des informations à ce sujet. Je comprends quelque chose comme HttpContext.Current.Session ["myKey"] = Value;

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

Merci -Venu

Répondre

6

Le HttpContext est recréé pour chaque requête. Le HttpSession, cependant, est stocké sur le serveur à travers les demandes. Fondamentalement, HttpSession est un dictionnaire < chaîne, dictionnaire < chaîne, objet > >. La clé initiale, l'ID 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, vous verrez le cookie ASP.NET_SessionId qui contient la clé pour 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; 
    } 
} 

La mise en œuvre réelle gère également les délais d'attente de session, abandonne et sessions cookieless - mais l'idée de base est la même.

+0

Ce dictionnaire n'est-il pas un dictionnaire concurrent? –

+0

@Christian - Je ne suis pas sûr que ce soit un ConcurrentDictionary. AFAIK, Session n'est pas nécessairement compatible avec les threads, mais sécurisée par requête grâce à la sérialisation de l'accès avec des verrous de lecture/écriture. –

0

Je ne pense pas qu'il y ait une réponse à votre question, parce que je ne pense pas que tout sous le parapluie 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. La façon dont il sait comment connecter les requêtes futures à cet état de session consiste à utiliser un cookie contenant une clé (totalement différente). Lorsque le navigateur fait une autre requête, il envoie ce cookie avec la requête et le serveur l'utilise pour déterminer à quelle session il doit correspondre. Une fois qu'il a compris, vous avez de nouveau accès à votre dictionnaire, à travers les réponses. 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 vers les dictionnaires d'état de session, et faire à peu près ce que je veux. décrit ci-dessus.

Questions connexes