Domanda

1 ° post su StackOverflow, spero di avere un ottimo feedback :)

Attualmente sto cercando di bilanciare il carico del nostro sito web. Abbiamo installato un bilanciamento del carico di rete a 2 cluster su Windows Server 2003 con IIS 6.

Durante il test dell'installazione, ho scoperto che a volte la nostra sessione è persa. Un giorno e mezzo dopo, ecco il risultato:

  1. Sì, il nostro machine.config ha entrambi la stessa chiave di crittografia / decrittografia.
  2. Sì, l'id in iis metabase.xml è lo stesso per entrambi i computer. In realtà, l'intero file è lo stesso, ad eccezione di " AdminACL " ;.
  3. Entrambe le applicazioni web sono impostate con " StateServer " ed entrambi puntano sulla stessa macchina.

Da quel momento, la ricerca su google fornisce meno informazioni e possibili soluzioni.

Da quello che so, non esiste un modello particolare che causa questo problema. Succede solo una volta ogni tanto.

Durante il tentativo di trovare il problema, ho visto che una richiesta ha inviato il cookie ID sessione ASP al server, ma il server non lo ha mappato alla sessione utente.

Quindi il numero di richiesta x è stato inviato dal client, con il cookie, la sessione è stata mappata e tutto è andato per il meglio. Il numero di richiesta x + 1 è stato inviato dal client, con il cookie, ma la sessione non è stata trovata.

Entrambe le richieste sono state fatte sulla stessa macchina in NLB.

Ecco un frammento di asp trace.axd:

1a richiesta:

Dettagli richiesta ID sessione: j2ffvy45updpc52uhw1mbg55 Tipo richiesta: GET Ora della richiesta: 26/11/2008 14:58:06 Codice di stato: 200 Codifica richiesta: Unicode (UTF-8) Codifica risposta: Unicode (UTF-8)

Richiedi raccolta cookie

Nome Valore Dimensione

ASP.NET_SessionId j2ffvy45updpc52uhw1mbg55 42 AIUTO 22 9

Raccolta dei cookie di risposta

Nome Valore Dimensione

Raccolta intestazioni

Nome valore

Cookie ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

2a richiesta:

Dettagli richiesta ID sessione: Tipo richiesta: POST Ora della richiesta: 26/11/2008 14:58:08 Codice di stato:
Codifica richiesta: Unicode (UTF-8) Codifica risposta:

Richiedi raccolta cookie

Nome Valore Dimensione

Raccolta dei cookie di risposta

Nome Valore Dimensione

Raccolta intestazioni Nome Valore Cookie ASP.NET_SessionId = j2ffvy45updpc52uhw1mbg55; AID = 22

Come puoi vedere nella seconda richiesta, il cookie viene inviato dal client, ma asp sembra non aggiungere mai i cookie nella sua " Richiesta raccolta cookie " ;. Penso che sia per questo che non trova la sessione.

Quindi perché il cookie non è mappato alla sessione? È questo il problema? Il problema è altrove?

Sentiti libero di chiedere qualsiasi chiarimento.

Grazie a tutti per il feedback.

JF

È stato utile?

Soluzione

Ho finalmente trovato la risposta al mio problema. La sua origine è all'interno del codice dell'applicazione (come il 99% dei "bug" degli strumenti di terze parti di un programmatore). Ho deciso di pubblicarlo comunque nel caso in cui qualcuno si trovi in ??uno scenario simile.

Questo codice faceva parte della classe WebServiceRequester. La classe del richiedente del servizio Web è stata istanziata al momento della creazione della sessione e viene salvata nella sessione. Durante la creazione, inizializziamo il membro 'm_webServiceURL' e questo membro viene salvato nella sessione successiva. A quale valore l'inizializzazione di questo membro dipendeva da un'impostazione sul computer locale.

La parte importante è la seguente: La classe WebServiceRequester contiene oggetti WebService. Gli oggetti WebService non possono essere salvati in sessione, non sono serializzabili in asp. La proprietà aveva l'attributo [Non serializzato] su di essa. Quindi ogni volta che accedevamo alla proprietà 'WebService' dell'oggetto per la prima durante un ciclo di vita della pagina, dovevamo crearne uno nuovo e assegnargli l'URL 'm_webServiceURL' che era stato salvato in sessione. Quindi vedete, un nuovo oggetto webservice, possibilmente su una macchina diversa, che significa un'impostazione diversa su ogni macchina.

quindi ecco cosa è successo: la casella 29 è stata impostata per accedere al servizio Web su localhost

la casella 30 è stata impostata per accedere al servizio Web come 192.168.253.29.

Tecnicamente, sono entrambi impostati sulla stessa macchina. Ma ecco uno scenario:

accedi alla casella 29. m_webServiceURL è impostato su localhost nella sessione.

[alcune richieste nella casella 29 qui]

Il bilanciamento NLB ci riporta alla casella 30. la casella 30 carica la sua sessione, crea un nuovo oggetto webservice con localhost come indirizzo del servizio web. la casella 30 ha effettuato la richiesta al servizio Web errato portando a un'eccezione Sessione scaduta.

Uno dei problemi durante il debug era che le comunicazioni locali non venivano registrate con il monitor di rete.

Ciò che mi ha portato alla traccia è stato il fatto che non abbiamo mai avuto un'eccezione registrata nella traccia del log della casella 29, come avrebbe dovuto.

Grazie per i suggerimenti a tutti, è stato davvero apprezzato.

Buona giornata. JF

Altri suggerimenti

Non è una risposta rigorosa alla tua domanda, ma l'hai provata usando un archivio di sessioni basato su SQL Server? (Cerca su MSDN lo script permanente anziché lo script temporaneo fornito con asp.net)

Ho sentito " cose cattive " sul servizio di sessione eseguibile e, di conseguenza, non l'ho usato. Tuttavia, non ho mai avuto problemi con l'agricoltura web con la soluzione basata su server SQL.

Mi dispiace che non sia strettamente una risposta al tuo problema, ma dovrebbe (a) risolverlo o (b) restringerlo in modo significativo.

Bene, se stai usando Visual Studio, potresti almeno provarlo con MSDE (la versione ridotta di SQL Server fornita con Visual Studio) ...

Potrebbe aiutare a escludere i problemi del server di stato ...

L'uso dell'approccio al database ha i suoi problemi. Penso che dovresti essere in grado di utilizzare il tuo approccio preferito.

Forse questo articolo di risoluzione dei problemi della sessione aiuterebbe?

Oppure " Risoluzione dei problemi relativi alla sessione in ASP.NET "

Oppure " Risoluzione dei problemi relativi allo stato della sessione ASP.NET scaduto e alle tue opzioni "

Sarò zoppo e reiterherò la proposta di MS SQL Server. Installa SQL Server Express che è completamente gratuito anche per uso commerciale e presenta solo questi 3 svantaggi che non dovrebbero essere un problema per te in questa fase:

  • Database di dimensioni massime 4 GB
  • Max 1 CPU Core utilizzato
  • Max 1 GB di RAM utilizzato

Alcuni punti da prendere in considerazione:

  • Qual è il carico sul tuo sito Web? State Server ha la tendenza a bloccarsi di fronte a un gran numero di hit simultanei. Lo stiamo usando solo in scenari in cui abbiamo un numero davvero ridotto di utenti (negli anni '10, principalmente sistemi back-end). Ogni volta che provavamo ad usarlo in produzione per siti che servono ogni giorno migliaia di utenti, si arrestava in modo anomalo portando alla perdita dei dati della sessione.
  • In uno degli ambienti di produzione che gestiamo, stiamo usando MSSQL 2005 Express per gestire le sessioni, il sito ha 10K + utenti al giorno e 200K + pagine al giorno. Questo è un approccio raccomandato nel caso in cui la sessione sia obbligatoria e strettamente associata alla tua applicazione.

Se stai per utilizzare MSSQL Express come DB di stato, ricorda che non viene fornito con SQL Server Agent, il che significa che non esiste un programmatore di attività in esecuzione in background e che pulisce le sessioni scadute. Consiglierei di trovare periodicamente uno scheduler ed eseguire periodicamente le stored procedure scadute pulite

Buona fortuna

Invece di giocare con SQL, invia i tuoi test direttamente in uno dei tuoi nodi IIS per vedere se hai ancora lo stesso problema. Sono sicuro che il tuo unico problema con StateServer non sarà un problema.

Prova a impostare il nome di dominio di asp.net_sessionid tramite il codice su " .tuodominio.com " ;. Per impostazione predefinita, il nome di dominio del cookie ASP.net_SessionID è impostato sul percorso completo dell'applicazione. Quindi, questo potrebbe essere uno dei motivi per cui il cookie non viaggia.

es. Request.Cookies [" ASP.NET_SessionId "]. Dominio = " .tuodominio.com " ;. Ricorda il primo ". & Quot; è importante nel nome di dominio.

È possibile farlo in HttpModule nell'evento AcquireRequestState.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top