2010-11-30 9 views
23

Mi sembra che ASP.net accoda tutte le richieste che utilizzano lo stesso ID sessione. Diciamo che hai 3 pagine.Richiesta di sessione ASP.net in coda

Default.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Session["asdf"] = "LOLZ"; 
} 

Colpire questa pagina sarebbe ovviamente creare una nuova sessione, se uno non esiste.

X-AspNet-Version: 2.0.50727 
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly 

Poi si colpisce Hang.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Thread.Sleep(10000); 
} 

E subito dopo aver colpito qualsiasi altra pagina che questo ID di sessione sarebbe passato a, non importa se si fa qualcosa, chiamiamolo di prova aspx.

La sequenza per il caricamento è così.

Request   Timeline 
"GET /"   |*| 
"GET /Hang.aspx"  |******************************************| 
"GET /Test.aspx"   |**************************************| 

Suppongo che la mia domanda sia come disabilitare questa funzione. Capisco che sia utile avere così che lo stato della sessione possa essere più prevedibile, tuttavia nel mio caso un carico di pagina di report di lunga durata sta uccidendo la capacità di multitasking degli utenti.

+0

Come stai testando questo? IIS o server di sviluppo Cassini in Visual Studio? – Kev

+0

IIS su Windows Server 2008, 7 Professional e VS 2010 Dev Server. – Novikov

+2

Ottima domanda, non ci avevo mai pensato prima. – Kev

risposta

19

Questo comportamento è di progettazione; non è consentito alcun accesso simultaneo allo stato della sessione. Le richieste con lo stesso SessionID verranno bloccate esclusivamente per impedire il potenziale danneggiamento del suo stato.

Per aggirare questo è possibile disabilitare lo stato della sessione nella direttiva della pagina.

<%@ Page EnableSessionState="false" %> 

Leggere "richieste simultanee e stato sessione" qui http://msdn.microsoft.com/en-us/library/ms178581.aspx per più.

L'impostazione EnableSessionState="ReadOnly" impedirà a tale pagina di ottenere un blocco esclusivo su SessionState (ma la pagina stessa dovrà attendere che altre richieste di ReadOnly vengano completate dall'utente prima del caricamento).

(Questo è un copia e incolla della mia risposta a questa domanda ASP.net site: Long-loading page for user puts all other page loads for user on Hold)

+1

Grazie per il link. Sembra una cattiva decisione di progettazione da parte di Microsoft, dal momento che il blocco esplicito o persino il blocco degli elementi nella raccolta rimuovono questa strana limitazione. Da alcune delle mie letture sembra che questo progetto sia un residuo da quando i dati di sessione risiedevano in un oggetto COM di STAThread. – Novikov

+3

@Novikov: Il problema è che la sessione viene caricata all'inizio e salvata alla fine di ogni richiesta di pagina. Per questo motivo è fondamentalmente volatile e non sicuro accedere a più pagine durante il ciclo. Immagina se Hang.aspx abbia modificato un valore di sessione chiave da cui dipendeva Test.aspx? In questo caso d'uso l'app sarebbe fondamentalmente fottuta. Questo non è specifico della COM, ma piuttosto di una di quelle questioni irrisolvibili. – NotMe

+1

+1 - Non sono mai riuscito a leggere fino all'ultimo paragrafo nei documenti MS. – Kev