2010-07-09 21 views
6

Mam dwie identyczne aplikacje instalacyjne na IIS w różnych katalogach wirtualnych (zrobiłem kilka obejść, aby upewnić się, że oba mają tę samą nazwę aplikacji). Czy istnieje sposób udostępniania identyfikatora sesji w dwóch aplikacjach internetowych asp.net?Jak zachować ten sam identyfikator sesji w wielu aplikacjach internetowych w ASP.NET

Ponieważ przechowuję sesję w StateServer, oba powinny otrzymywać te same dane sesji, jednak inny identyfikator sesji jest tworzony za każdym razem, gdy przechodzę z aplikacji a do aplikacji b. Czy nie zdarzyłoby się to również w scenariuszu równoważenia obciążenia? Gdzie, kiedy wejdę na stronę www.test.com, przekieruje to żądanie do serwera a, a jeśli znów go uderzę, przejdzie do serwera b, ale ponieważ jest to inna aplikacja internetowa, utworzy nowy identyfikator sesji ?

+0

Wystarczy wrzucić go do bazy danych. Odchylacie się do tyłu, aby uwzględnić ograniczenia sesji. –

+0

Baza danych będzie miała ten sam problem, chyba że zastosuję obejście. Ponieważ jest to dwie różne aplikacje w DB, miałby 2 oddzielne sesje. –

+0

Źle zrozumiesz moją sugestię. Zamiast w ogóle korzystać z sesji *, umieść dowolne trwałe dane w wspólnej bazie danych. Sesje i pliki cookie są zaprojektowane tak, aby aplikacje nie nadepnęły na siebie, co wymaga izolacji. Jest to jedna z wielu rzeczy, dla których bazy danych są dobre. –

Odpowiedz

7

Najpierw skonfiguruj element sessionState w pliku web.config tak, aby używał nazwy ciasteczko = "SOME_COOKIE_NAME_HERE" w obu aplikacjach.

Następnie upewnij się, że adresy URL mają tę samą TLD (domenę najwyższego poziomu), np. App1.mydomain.com i app2.mydomain.com, i powinieneś być w stanie obsłużyć zdarzenie Session_Start w Global.asax i umieścić ten kod:

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

Polecam również, aby przejść do trybu SessionSate SqlServer.

+0

Czy to też działa z trybem sesji StateServer? –

+0

Nie rozumiem, dlaczego nie. –

+0

Interesujące. Po zastosowaniu tej zmiany otrzymuję nowy identyfikator sesji na żądanie. Oto mój kod Global.asax: \t void session_start (object sender, EventArgs e) { \t \t \t HttpCookie ciasteczko = new HttpCookie ("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} Oto moja konfiguracja web.config: \t \t

-1

Czy Twoim celem jest udostępnianie stanu sesji między 2 aplikacjami, a nie tylko identyfikatorem sesji? Wierzę, że StateServer używa również ścieżki aplikacji, jak również SessionID do przechowywania danych, więc nawet jeśli identyfikatory SessionID były takie same, nadal nie byłbyś w stanie udostępniać danych. Być może będziesz musiał napisać swój własny moduł sesji.

Aplikacje sieciowe równoważenia obciążenia nie mają tego problemu, ponieważ ścieżka aplikacji jest taka sama w różnych elementach klastra.

+0

Masz rację. Używam httpmodule do ustawienia tej samej nazwy aplikacji dla obu aplikacji na tę samą wartość. –

+0

Powiedział, że zadał sobie trud uzyskania nazwy aplikacji tak samo –

1

Początkowo stanąłem w obliczu tego samego problemu. To, co zrobiłem, przekroczyłem identyfikator jsession z każdej domeny. Mam na myśli to, że jeśli użytkownik wyląduje na domenie domain1.com, ustaw ten sam identyfikator sesji dla domeny2.com z elementu iframe. i wzajemnie. Dzięki temu możesz utrzymać tę samą sesję w wielu domenach.

Należy przetestować wpływ na wiele serwerów w sieci za pomocą mechanizmu równoważenia obciążenia.