Domanda

ho capito che tutti i dati della sessione InProc è sempre andato quando il suo processo proprietario w3wp ricicla in quanto risiede solo nella memoria w3wp.

Mi chiedevo però se è possibile memorizzare nella cache i dati della sessione quando il riciclaggio accade da qualche parte esterna al processo, e poi reiniettare (e ricostruire) la sessione quando si torna su. In questo modo avrei avuto la velocità del InProc con l'affidabilità di esternalizzazione server di stato simile a quando è necessario. È possibile?

È stato utile?

Soluzione

No, questo non è possibile. Non v'è alcuna API per "riscaldare" in-process lo stato della sessione o cache. Una tale soluzione sarebbe inaffidabile comunque. Non si poteva gaurantee che l'ultima cosa che ha fatto la vostra applicazione potrebbe essere quella di esportare il suo stato di sessione corrente, quindi non si poteva mai contare sui dati importati per essere corrente in ogni caso.

È possibile utilizzare il server di stato out-of-process sullo stesso host come l'applicazione web. Quindi l'applicazione web può riciclare liberamente, mantenendo intatte le informazioni di stato. Questo è un po 'più veloce rispetto all'utilizzo di SQL Server per gestire le sessioni, mentre non si ha a che fare con il sovraccarico di SQL o di transito di rete a un'altra macchina, l'unico modo è peggio di in-process stato della sessione è che i dati devono maresciallo oltre i limiti di processo, ma fino a quando non si dispone di una quantità enorme di rapida evoluzione dati di sessione, questo non dovrebbe essere evidente a tutti.

Ci sono anche altre alternative, come ad esempio Microsoft Codice progetto denominato "Velocity" o di ScaleOut Software SessionServer (tra gli altri ne sono sicuro) che offrono meccanismi di caching distribuito che possono mantenere lo stato della sessione o della cache sincronizzata tra i server di una server farm, senza dover ricorrere all'utilizzo di SQL Server.

Al contrario di ciò che un altro utente ha postato, non voglio usare ViewState per memorizzare i dati della sessione, se possibile. Per uno, non è vero lo stato della sessione, se un utente si sposta indietro o in avanti può essere perso. In secondo luogo, è abbastanza insicuro. In terzo luogo, esso provoca pagina massiccia troppo grosso caso di abuso.

Altri suggerimenti

Forse è possibile memorizzare informazioni sufficienti in un cookie (o in ViewState) in modo da poter ricreare una sessione in base a tali dati nel caso in cui il processo di lavoro è stato riciclato.

In alternativa è possibile creare il proprio server di stato (ad esempio, un servizio di Windows) in cui memorizzare parte della sessione, e accedere a questo servizio dalla app web tramite i servizi remoti o simili.

Si consiglia di utilizzare SQL Server per stato sessione se è la vostra intenzione. Ciò che si vuole sono le sessioni che possono recuperare da un finale completa del processs ospite. Né inproc o StateServer sostengono che, come una volta che scendono perdono tutti i dati. Si potrebbe scrivere il proprio metodo di stato, ma che sarebbe laboriuous. Ecco le indicazioni se si vuole fare questo:

http://www.exforsys.com/tutorials/asp.net-2.0/asp.net-2.0-customizing-the-session-state-mechanism.html

Che cosa si può desiderare di fare è di non usare le sessioni a tutti, ma piuttosto si basano più su ViewState. Se si dispone di un sito ad alto traffico che è un buon modo per spingere il carico di lavoro fuori ai clienti.

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