Domanda

Mi chiedo come venga mantenuto HttpContext dato che la natura richiesta-risposta del web è essenzialmente senza stato.

Un identificatore sta per l'oggetto HttpContext inviato come parte dei campi nascosti __EVENTTarget / __EVENTARGUMENTS in modo che la classe HttpRuntime possa creare la classe HttpContext leggendo questa sezione dalla richiesta (HttpWorkerRequest)? Non credo

Per favore fatemi sapere mentre sto cercando di riempire alcuni buchi nella mia comprensione della pipeline http e non sono stato in grado di trovare alcuna informazione al riguardo.

Capisco qualcosa del genere HttpContext.Current.Session [& Quot; myKey & Quot;] = Value;

funziona, ma se dovessi fare qualcosa di simile in una lingua diversa (diciamo perl), dovrei usare i campi nascosti per lo stesso, no?

Grazie -Venu

È stato utile?

Soluzione

L'HttpContext viene ricreato per ogni richiesta. HttpSession, tuttavia, è memorizzato sul server tra le richieste. Fondamentalmente, HttpSession è un dizionario & Lt; stringa, dizionario & Lt; stringa, oggetto & Gt; & Gt ;. La chiave iniziale, l'id di sessione, è fornita da un cookie o da un parametro della stringa di query (se si utilizzano sessioni senza cookie). Se usi Fiddler, vedrai il cookie ASP.NET_SessionId che contiene la chiave per la sessione dell'utente.

Nel codice:

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 vera implementazione gestisce anche i timeout delle sessioni, gli abbandoni e le sessioni senza cucina, ma l'idea di base è la stessa.

Altri suggerimenti

Non credo che ci sia una risposta alla tua domanda, perché non credo che tutto sotto l'ombrello HttpContext funzioni allo stesso modo. Nell'esempio che hai scelto, lo stato della sessione, sia la chiave che il valore sono memorizzati sul lato server. Il modo in cui sa come collegare le richieste future a quello stato di sessione è utilizzando un cookie che contiene una chiave (totalmente diversa). Quando il browser invia un'altra richiesta, invia questo cookie con la richiesta e il server lo utilizza per capire a quale sessione mappare. Una volta capito, hai di nuovo accesso al tuo dizionario, attraverso le risposte.

Quindi, per farlo in perl, dovresti creare manualmente un cookie e memorizzare una chiave univoca in esso, avere una mappatura sul lato server di quelle chiavi univoche ai dizionari dello stato della sessione e praticamente fare quello che ho descritto sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top