Ho appena scoperto che ogni richiesta in un'applicazione Web ASP.Net ottiene un blocco della sessione all'inizio di una richiesta e quindi la rilascia alla fine della richiesta!
Nel caso in cui le implicazioni di ciò vadano perse per te, com'era inizialmente per me, ciò significa sostanzialmente quanto segue:
Ogni volta che una pagina Web ASP.Net impiega molto tempo a caricarsi (forse a causa di una chiamata al database lenta o altro) e l'utente decide di voler navigare su una pagina diversa perché sono stanchi di aspettare, NON POSSONO! Il blocco della sessione ASP.Net impone alla nuova richiesta di pagina di attendere fino a quando la richiesta originale ha terminato il suo carico dolorosamente lento. Arrrgh.
Ogni volta che UpdatePanel si carica lentamente e l'utente decide di passare a una pagina diversa prima che UpdatePanel abbia terminato l'aggiornamento ... NON POSSONO! Il blocco della sessione ASP.net forza la richiesta della nuova pagina ad attendere fino a quando la richiesta originale ha terminato il suo carico dolorosamente lento. Doppio Arrrgh!
Quindi quali sono le opzioni? Finora ho escogitato:
- Implementare un SessionStateDataStore personalizzato, supportato da ASP.Net. Non ne ho trovati troppi là fuori da copiare, e sembra un po 'ad alto rischio e facile da sbagliare.
- Tieni traccia di tutte le richieste in corso e se una richiesta arriva dallo stesso utente, annulla la richiesta originale. Sembra un po 'estremo, ma funzionerebbe (penso).
- Non usare la sessione! Quando ho bisogno di un qualche tipo di stato per l'utente, potrei semplicemente usare Cache e gli elementi chiave sul nome utente autenticato, o qualcosa del genere. Ancora una volta sembra un po 'estremo.
Non riesco davvero a credere che il team di ASP.Net Microsoft avrebbe lasciato un enorme collo di bottiglia nelle prestazioni alla versione 4.0! Mi sto perdendo qualcosa di ovvio? Quanto sarebbe difficile utilizzare una raccolta ThreadSafe per la sessione?