abbiamo un problema con un sito Web ASP.NET in cui le sessioni degli utenti si comportano in modo strano: i dati della sessione appaiono, scompaiono e riappaiono.
Penso di sapere qual è il problema:
- La nostra configurazione è 2 x WebServer con bilanciamento del carico + database di stato a sessione singola.
- L'archiviazione dello stato della sessione SQL ASP.NET sembra dipendere dall'ID istanza del sito Web IIS (ID metabase) per identificare in modo univoco l'ID del cookie della sessione in entrata e recuperare / archiviare i valori.
- L'ID istanza del sito Web IIS del sito Web è diverso su ciascuno dei server attivi (ID / W3SVC / 1 / Root sul server Web A, ID / W3SVC / 2 / Root sul server Web B).
- Il bilanciamento del carico non utilizza l'affinità del client, quindi ogni richiesta HTTP dell'utente può essere indirizzata a entrambi i server.
Pertanto, quando un utente accede al sito e si sposta, ogni chiamata HTTP può passare a uno dei server Web e quindi utilizzare un record dello stato della sessione con ID diversi a seconda del server. In effetti l'utente avrebbe contemporaneamente 2 istanze di sessione separate. Credo di averlo verificato come nella tabella ASPStateTempSessions del database , ogni ID cookie di sessione sembra corrispondere a 2 record con nomi quasi identici (i loro ID differiscono solo per gli ultimi caratteri, che credo siano un modificatore basato sull'AppID dal AspStateTempApplications table) creato a pochi secondi l'uno dall'altro.
Pertanto, lo stato della sessione sembrerà comportarsi in modo errato poiché le modifiche apportate a un record di sessione persistono solo per quel server Web. Se l'utente si sposta sull'altro server con bilanciamento del carico, i valori della sessione sembreranno scomparire o ripristinare.
Credo che la soluzione sia sincronizzare gli ID istanza IIS dei siti (ad es . Renderli entrambi / W3SVC / 1 / Root ), ma ho provato a modificare quel valore in IIS in Impostazioni avanzate e, sebbene sia stato salvato OK, ha appena reso sito restituisce 404s su quel server fino a quando non l'ho cambiato.
Ho trovato uno script VBS per questo problema, ma sembra essere solo per IIS 6, quindi sono preoccupato di provarlo. Qualcun altro ha riscontrato questa situazione su IIS 7.5 e come è stata risolta?
MODIFICA / SOLUZIONE
Il mio errore è stato che ho dimenticato di riavviare IIS dopo aver modificato l'ID istanza del sito in IIS. Successivamente, l'ID è stato aggiornato e le sessioni ASP.NET sono state sincronizzate sui due server Web.
Istruzioni complete:
- Desktop remoto sul server LIVE1, apri IIS Mgr, fai clic sul sito problematico e scegli Impostazioni avanzate nella barra laterale.
- Cambia l'ID in qualcosa di unico, ad es. 10. Fai clic su OK.
- Riavvia il servizio Web (
c:\windows\system32\iisreset /restart
)
Fai lo stesso per LIVE2 (assicurati che l'ID sito sia lo stesso di LIVE1)
Si noti che l'ID del sito influisce sulla posizione dei file del sito, ad esempio la cartella dei file di registro diventerebbe C:\inetpub\logs\LogFiles\W3SVC10
ad esempio.
Si noti inoltre che si potrebbe fare queste modifiche manualmente modificando il sito id attributo nel file di configurazione di IIS su ciascun server: C:\Windows\System32\inetsrv\config\applicationHost.config
. Richiede i privilegi di amministratore e in seguito deve essere ripristinato.