2010-07-09 11 views
6

Ho due identiche applicazioni installate su IIS su diverse directory virtuali (ho fatto qualche soluzione per garantire che abbiano entrambi lo stesso nome dell'applicazione). C'è un modo per condividere l'ID di sessione su due applicazioni web asp.net?Come mantenere lo stesso ID di sessione su più applicazioni Web in ASP.NET

Poiché sto memorizzando la sessione in StateServer, entrambi dovrebbero ricevere gli stessi dati di sessione, tuttavia viene creato un id di sessione diverso ogni volta che passo dall'applicazione a all'applicativo b. Non sarebbe questo anche in uno scenario di bilanciamento del carico? Dove quando vado su www.test.com, reindirizza quella richiesta al server a, e poi se la colpisco di nuovo, andrebbe al server b, ma poiché si tratta di un'applicazione web diversa, creerebbe un nuovo ID di sessione ?

+0

Basta lanciarlo in un database. Ti stai piegando all'indietro per soddisfare i limiti della sessione. –

+0

Il database avrebbe lo stesso problema a meno che non applichi una soluzione alternativa. Dal momento che si tratta di due diverse applicazioni nel DB, avrebbe 2 sessioni separate. –

+0

Hai frainteso il mio suggerimento. Invece di utilizzare * la sessione *, posiziona qualsiasi dato persistente richiesto in un database comune. Sessioni e cookie, sono progettati per impedire alle applicazioni di pestarsi reciprocamente, il che richiede isolamento. Questa è una delle tante cose a cui i database servono. –

risposta

7

Innanzitutto, configura l'elemento sessionState nel tuo web.config per utilizzare cookieName = "SOME_COOKIE_NAME_HERE" in entrambe le app.

Quindi, assicurati che gli URL abbiano lo stesso TLD (dominio di primo livello), ad esempio app1.mydomain.com e app2.mydomain.com e dovresti essere in grado di gestire l'evento Session_Start in Global.asax e mettere questo codice:

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

Inoltre, ti consiglio di utilizzare la modalità SessionState di SqlServer.

+0

Funzionerebbe anche con la modalità sessione StateServer? –

+0

Non vedo perché no. –

+0

Interessante. Dopo aver applicato questa modifica, ottengo un nuovo ID di sessione per richiesta. Ecco il mio codice Global.asax: \t vuoto Session_Start (object sender, EventArgs e) { \t \t \t HttpCookie biscotto = 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} Ecco la mia configurazione web.config: \t \t

-1

Il tuo obiettivo è condividere lo stato della sessione tra 2 applicazioni, non solo l'ID di sessione? Credo che lo StateServer utilizzi anche il percorso dell'applicazione e SessionID per archiviare i dati, quindi anche se i SessionID fossero gli stessi non si sarebbe ancora in grado di condividere i dati. Potrebbe essere necessario scrivere il proprio modulo di sessione.

Le applicazioni Web per il bilanciamento del carico non presentano questo problema perché il percorso dell'applicazione è uguale tra i membri del cluster.

+0

Sei corretto. Sto usando un httpmodule per impostare lo stesso nome dell'applicazione per entrambe le applicazioni sullo stesso valore. –

+0

Ha detto che si è preso il disturbo di ottenere il nome dell'applicazione lo stesso –

1

Inizialmente ho affrontato lo stesso problema. Quello che ho fatto è che ho oltrepassato l'ID jsession di ciascun dominio. Voglio dire, se l'utente atterra su domain1.com, imposta lo stesso id di sessione per domain2.com da iframe. e viceversa. Con questo, è possibile mantenere la stessa sessione su più domini.

È necessario testare l'impatto su più server su rete con bilanciamento del carico.