2010-07-09 6 views
6

Ich habe zwei identische Anwendungen auf IIS auf verschiedenen virtuellen Verzeichnissen eingerichtet (ich habe einige Workarounds durchgeführt, um sicherzustellen, dass beide den gleichen Anwendungsnamen haben). Gibt es eine Möglichkeit, Sitzungs-ID über zwei asp.net-Webanwendungen zu teilen?Wie Sie die gleiche Sitzungs-ID über mehrere Webanwendungen in ASP.NET beibehalten

Da ich die Sitzung in StateServer speichern, sollten beide die gleichen Sitzungsdaten erhalten, jedoch wird jedes Mal, wenn ich von Anwendung A zu Anwendung b gehe, eine andere Sitzungs-ID erstellt. Würde dies nicht auch in einem Lastenausgleichsszenario passieren? Wo, wenn ich zu www.test.com gehe, würde es diese Anfrage zum Server a umleiten, und wenn ich es dann wieder traf, würde es zu Server b gehen, aber da es eine andere Webanwendung ist, würde es eine neue Sitzungsidentifikation verursachen ?

+0

Werfen Sie es einfach in eine Datenbank. Sie beugen sich nach hinten, um den Einschränkungen der Sitzung zu entsprechen. –

+0

Die Datenbank würde das gleiche Problem haben, wenn ich eine Umgehung nicht anwende. Da es zwei verschiedene Anwendungen in der DB gibt, würde es zwei separate Sitzungen haben. –

+0

Sie missverstehen meinen Vorschlag. Anstatt die Sitzung * überhaupt * zu verwenden, legen Sie die gewünschten persistenten Daten in einer gemeinsamen Datenbank ab. Sitzungen und Cookies wurden entwickelt, um zu verhindern, dass Anwendungen aufeinander treten, was eine Isolierung erfordert. Dies ist eines der vielen Dinge, für die Datenbanken gut sind. –

Antwort

7

Konfigurieren Sie zuerst das sessionState-Element in Ihrer web.config, um in beiden Apps cookieName = "SOME_COOKIE_NAME_HERE" zu verwenden.

Dann stellen Sie sicher, dass die URLs die gleiche TLD (Top-Level-Domain) haben, dh app1.mydomain.com und app2.mydomain.com und Sie sollten in der Lage sein, das Session_Start-Ereignis in Global.asax und Put zu behandeln Dieser Code:

HttpCookie cookie = new HttpCookie("SOME_COOKIE_NAME_HERE", Session.SessionID.ToString()); 
    cookie.Expires = DateTime.Now.AddMinutes(20); 
    cookie.Domain = "*.mydomain.com"; 
    cookie.HttpOnly = true; 
    Response.SetCookie(cookie); 

Auch würde ich empfehlen, dass Sie mit dem SqlServer SessionState Mode gehen.

+0

Würde dies auch mit StateServer-Modus arbeiten? –

+0

Ich sehe nicht warum nicht. –

+0

Interessant. Nach dem Anwenden dieser Änderung erhalte ich eine neue Sitzungs-ID pro Anfrage. Hier ist meine Global.asax Code: \t Leere Session_Start (object sender, EventArgs e) \t { \t \t Http cookie = new Http ("Sessioncookie", Session.SessionID.ToString()); \t \t cookie.Expires = DateTime.Now.AddMinutes (20); \t \t cookie.Domain = "* .keivantest.com "; \t \t cookie.HttpOnly = true; \t \t Response.SetCookie (Cookie); \t} Hier ist meine web.config Konfiguration: \t \t

-1

Ist es Ihr Ziel, den Sitzungsstatus zwischen zwei Anwendungen zu teilen, nicht nur die Sitzungs-ID? Ich glaube, der StateServer verwendet auch den Anwendungspfad sowie die SessionID, um die Daten zu speichern, selbst wenn die SessionIDs identisch wären, könnten Sie die Daten nicht teilen. Möglicherweise müssen Sie Ihr eigenes Sitzungsmodul schreiben.

Load Balancing Web-Anwendungen haben dieses Problem nicht, da der Anwendungspfad über Cluster-Mitglieder hinweg gleich ist.

+0

Sie haben Recht. Ich verwende ein httpmodul, um denselben Anwendungsnamen für beide Anwendungen auf denselben Wert festzulegen. –

+0

Er sagte, er ging zu dem Problem, den Namen der Anwendung die gleiche –

1

Anfangs hatte ich das gleiche Problem. Was ich gemacht habe, ist, dass ich die Jsession ID aus jeder Domain überstehe. Ich meine, wenn der Benutzer auf domain1.com landet, legen Sie die gleiche Sitzungs-ID für domain2.com von iframe fest. und umgekehrt. Damit können Sie dieselbe Sitzung für mehrere Domänen beibehalten.

Sie müssen die Auswirkungen auf mehrere Server über das Netzwerk mit Load Balancer testen.

Verwandte Themen