2011-11-07 6 views
25

Qual è la differenza tra IRequiresSessionState e IReadOnlySessionState accanto all'incapacità del secondo di salvare le modifiche alle variabili di sessione?IRequiresSessionState vs IReadOnlySessionState

Entrambi mi forniscono la possibilità di accedere alle variabili di sessione nel mio HttpHandler. Ma perché preferirei IReadOnlySessionState? Mi limita semplicemente a salvare la sessione per la prossima richiesta.
Oppure mi dà un vantaggio in termini di prestazioni rispetto a IRequiresSessionState?

Quando preferirei utilizzare IReadOnlySessionState su IRequiresSessionState?

risposta

24

Una differenza fondamentale è che IRequiresSessionState mette un blocco esclusivo sulla sessione corrente, limitando potenzialmente il numero di richieste simultanee da parte dell'utente corrente. (Per ulteriori informazioni su questo fenomeno di blocco, vedere Is it possible to force request concurrency when using ASP.NET sessions?)

Al contrario, IReadOnlySessionState non acquisisce un blocco esclusivo.

Questa è la stessa cosa documentata in renad's helpful answer to an almost identical SO question.

La migliore documentazione ufficiale che ho trovato per questo è da MSDN articolo Session State Providers:

Tre dei metodi più importanti di un provider di stato della sessione sono GetItem, GetItemExclusive e SetAndReleaseItemExclusive. I primi due sono chiamati da SessionStateModule per recuperare una sessione dall'origine dati. Se la pagina richiesta implementa l'interfaccia IRequiresSessionState (per impostazione predefinita, tutte le pagine implementano IRequiresSessionState), il gestore di eventi AcquireRequestState di SessionStateModule chiama il metodo GetItemExclusive del provider dello stato sessione. La parola "Exclusive" nel nome del metodo indica che la sessione deve essere recuperata solo se non è attualmente utilizzata da un'altra richiesta. Se, d'altra parte, la pagina richiesta implementa l'interfaccia IReadOnlySessionState (il modo più comune per ottenere questo è includere un attributo EnableSessionState = "ReadOnly" nella direttiva @ Page della pagina), SessionStateModule chiama il metodo GetItem del provider. Non è richiesta alcuna esclusività qui, poiché gli accessi in lettura sovrapposti sono consentiti da SessionStateModule.

Nota il parallelo tra l'utilizzo in modo esplicito queste interfacce e utilizzando la direttiva EnableSessionState Pagina:

  • EnableSessionState = False < -> nessuna I * interfaccia SessionState
  • EnableSessionState = True < -> IRequiresSessionState interfaccia
  • EnableSessionState = ReadOnly < -> IReadOnlySessionState
+2

+1 per il blocco - ** estremamente ** importante se un'applicazione web può elaborare una manciata di richieste asincrone allo stesso tempo che utilizzano lo stato della sessione. –

1

Seguire questa http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

IRequiresSessionState è derivato da System.Web.SessionState utilizzando questa interfaccia accediamo sessione HttpHandler e classe File

Se avete bisogno di accesso in sola lettura alla sessione, l'attuazione del IReadOnlySessionState interfaccia.

+0

Sì, so per cosa viene utilizzato 'IRequiresSessionState', ma perché esiste' IReadOnlySessionState'? Perché preferirei usarlo? –

+0

In PostMapRequestHandler lo HttpModule scambia dal gestore reale a un gestore personalizzato che implementa IRequiresSessionState o IReadOnlySessionState in modo che possa utilizzare seesion. PreRequestHandlerExecute è possibile accedere alla sessione e al reindirizzamento se necessario. A PostAcquireRequestState si passa di nuovo al gestore originale. – coder

6

Tale interfaccia controlla se il framework salverà lo stato corrente della sessione al termine della richiesta. Fa una grande differenza quando stai usando la memoria di stato sessione fuori processo. In tal caso, senza l'interfaccia, il sistema memorizzerà comunque i dati della sessione nel database remoto, anche quando non è stato modificato (il sistema non tiene traccia di se i dati della sessione sono stati modificati durante la richiesta). Quando si utilizza l'interfaccia IReadOnlySessionState, la fase di write-back viene saltata.

+2

Da dove hai preso quelle informazioni? puoi fare riferimento al link? –