Frage

Ich frage mich, wie die Httpcontext gegeben gehalten wird, dass die Anfrage-Antwort-Natur des Webs im Wesentlichen staatenlos ist.

Ist eine Kennung für das Httpcontext-Objekt zu sein, die als Teil des __EVENTTarget / __EVENTARGUMENTS geschickt versteckte Felder, so dass die Httpruntime-Klasse der Httpcontext Klasse durch diesen Abschnitt liest aus der Anforderung erstellen (Httpworkerrequest)? Ich glaube nicht,

Bitte lassen Sie mich wissen, wie ich einige Löcher in meinem Verständnis der http-Pipeline zu füllen, ich versuche, und ich konnte keine Informationen darüber finden.

Ich verstehe so etwas wie HttpContext.Current.Session [ "myKey"] = Wert;

funktioniert, aber wenn ich etwas tun mußte, ähnlich in einer anderen Sprache (zB Perl), würde ich versteckte Felder für das gleiche verwenden muß, würde ich nicht?

Danke -Venu

War es hilfreich?

Lösung

Der Httpcontext für jede Anforderung neu erstellt. Die Http wird jedoch auf dem Server über Anfragen gespeichert. Grundsätzlich Http ist ein Dictionary >. Der anfängliche Schlüssel, die Session-ID, wird entweder durch ein Cookie oder ein Abfrage-String-Parameter (bei Verwendung von Cookie-less Sitzungen) zur Verfügung gestellt. Wenn Sie Fiddler verwenden, werden Sie die ASP.NET_SessionId Cookie sehen, der die Schlüssel des für diese Benutzersitzung enthält.

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

Die eigentliche Implementierung übernimmt auch Session-Timeouts, verlässt, und Sitzungen ohne Cookies - aber die Grundidee ist die gleiche

.

Andere Tipps

Ich glaube nicht, es gibt eine Antwort auf Ihre Frage, weil ich nicht glaube, alles unter dem Dach Httpcontext auf die gleiche Weise funktioniert. Im Beispiel von Ihnen gewählten Sitzungszustand, sowohl der Schlüssel und der Wert auf der Serverseite gespeichert. Die Art und Weise weiß, wie zukünftige Anforderungen in diesem Sitzungszustand hook up ist durch einen Cookie verwenden, die einen (ganz anders) Schlüssel drin hat. Wenn der Browser eine weitere Anforderung macht, sendet er dieses Cookie mit der Anfrage und der Server verwendet es die Sitzung um herauszufinden, abzubilden. Sobald sie es herausfindet, haben für Sie wieder Zugang zu Ihrem Wörterbuch, über Antworten.

Also, zu tun es in Perl, würde Sie manuell einen Cookie erstellen und speichern einen eindeutigen Schlüssel darin, eine serverseitige Zuordnung dieser eindeutigen Schlüssel zu Sitzungsstatus Wörterbücher, und ziemlich viel zu tun, was ich beschrieben oben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top