2013-09-04 26 views
5

Sto sviluppando un sito Web asp.net.Contenuto scambiato per più sessioni utenti nel sito Web asp.net

  • Quando due utenti diversi accedono a quel sito Web con sessioni diverse, il contenuto di un utente viene scambiato con un altro utente.
  • Sto usando javacsript, chiamando i pagemethods dalle pagine .aspx e C# al codice dietro.
  • Questo problema si verifica principalmente quando due utenti chiamano la stessa funzionalità alla volta.
  • Pensavo che le variabili statiche potessero causare questo problema e ho cercato di non utilizzare alcuna variabile statica o funzione statica ad eccezione delle funzioni di pagemethod in cui è obbligatorio che un pagemetodo sia statico.

per favore aiutatemi con questo problema.

+2

Potresti postare un esempio di codice? – Damon

+0

Questo sito è protetto da un sistema di bilanciamento del carico? La tua sessione è archiviata in processo o in un database? –

+0

@Damon questo non è correlato a un particolare blocco di codice .. questo problema si verifica ovunque venga utilizzata una variabile statica. Ho cercato di evitare variabili statiche e metodi statici, ma per i pagemethod è obbligatorio avere una funzione statica. comunque se hai bisogno di un codice di esempio, lo fornirò. – Hulk

risposta

1

Abbiamo avuto un problema simile e abbiamo scoperto che era il nostro loadbalancer (f5 Big-IP) che ha incasinato gli id ​​di sessione. Abbiamo cambiato il loadbalancer per essere stateful e ora funziona perfettamente ...

5

Potrebbe anche essere correlato alla filettatura. Lock quelle variabili e vedere se questo aiuta.

I metodi statici non garantiscono lo stato di variabile statica anche se i metodi sono garantiti come thread-safe. Devi gestire tale stato e asp.net considera le variabili statiche come condivise tra tutti gli utenti. Vedere this answer da una domanda correlata.

Più lettura: Thread Synchronization

+0

Il blocco delle variabili statiche/delle funzioni statiche va bene, ma quando n numero di utenti accedono alla stessa funzionalità, allora questo blocco potrebbe rallentare il sito web, giusto? – Hulk

+0

Il costo sarà nella maggior parte dei casi trascurabile, raramente ho incontrato uno scenario in cui ho dovuto tornare indietro e ottimizzare. Ma quando cominci a guardare la sincronizzazione dei thread è un mondo completamente nuovo. Un sacco di cose divertenti complicate come [Semaphores] (http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx) e [Mutexes] (http://msdn.microsoft.com/en -us/library/system.threading.mutex.aspx). – TombMedia

+0

Ci scusiamo per tutti i commenti Hulk, ma [questa domanda] (http://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock) è davvero quella che si desidera leggere, [questa] (http : //stackoverflow.com/questions/4673618/how-expensive-is-the-lock-statement) risponde alla tua domanda sulla velocità, ma la risposta breve è 50ns. – TombMedia

1
  • attivare il servizio dello stato aspnet in servizi di Windows.
  • uso sessione [ "x"] al posto di Static x
  • uso ViewState [ "x"] per il livello di pagina Valori
1

Controllare la configurazione dello stato sessione (vedi esempio sotto). Forse si utilizza un'altra modalità rispetto a "InProc" e si stanno verificando alcuni problemi.

<sessionState mode="InProc" cookieless="false" timeout="60" /> 

Si potrebbe anche considerare l'utilizzo di memorizzazione nella cache istanze con le chiavi che utilizzano il SessionID come prefisso. La libreria aziendale offre un'implementazione efficace per la memorizzazione nella cache.

Spero che questo aiuti.

1

rimuovere la variabile statica e il metodo statico utilizzato per rispondere alla richiesta.

1

Aggiungere sessionState nel web.config:

<configuration> 
    <system.web> 
    <sessionState timeout="120" mode=" [InProc|StateServer|SQLServer|Custom]" cookieless="false" /> 
    </system.web> 
</configuration> 

Prova anche la seguente soluzione:

  1. Start> Strumenti di amministrazione> Servizi
  2. tasto destro del mouse su ASP.NET Stato Servizio e fare clic su 'start'.

Anche le variabili devono BLOCCO come indicato in @TombMedia's Answer.

Questo collegamento può essere aiutare: Exploring Session in ASP.NET

0

questo è da impostare nel web.config e <% @ OutputCache Duration = "1" VaryByParam = "none" %> questo per essere rimosso tutto l'aspx forme ..

saluti Rs