Hosting e scadenza anticipata della sessione

martedì 07 agosto 2012 - 09.26
Tag Elenco Tags  C#  |  .NET 3.5  |  .NET 4.0  |  Visual Studio 2010

andrestu Profilo | Expert

Salve a tutti,
Vorrei sapere se esistono tecniche alternative per evitare che la sessione scadi anticipatamente, mi spiego meglio.
Ho sviluppato un sito web le cui funzionalità utilizzano l'oggetto session per vari scopi. Ho impostato quindi il timeout di sessione nel web.config a 40 minuti.
In locale funziona tutto regolarmente, la sessione mi scade al tempo previsto, al contrario quando il sito viene pubblicato in rete il time-out non viene considerato e la scadenza avviene sotto i 10 minuti.
Premetto che come hosting utilizzo register ma non utilizzo un server dedicato quindi al massimo a riguardo di IIS posso decidere se usare il Net 2 o 4 e la modalità pipeline classica o integrata.
Credo che il comportamento sia dovuto ad un riciclo abbastanza frequente dell'application da parte di IIS quindi automaticamente tirando giù l'application tira giù anche la session, cè un modo per risolvere questo problema a parte quello di acquistare un server dedicato ???
consigli e suggertimenti ???

Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>Salve a tutti,
Ciao

>Credo che il comportamento sia dovuto ad un riciclo abbastanza
>frequente dell'application da parte di IIS quindi automaticamente
>tirando giù l'application tira giù anche la session, cè un modo
>per risolvere questo problema a parte quello di acquistare un
>server dedicato ???
>consigli e suggertimenti ???
Hai provato a seguire delle tecniche per il keep alive della sessione? Qui un paio di esempi:
http://www.codeproject.com/Articles/10550/The-Defibrillator-Keeping-ASP-NET-Session-Alive-Ad
http://stackoverflow.com/questions/1431733/keeping-asp-net-session-open-alive

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

grazie dei link suggeriti, anche se non risolvono il mio problema queste tecniche possono tornare utili.
il fatto è che la chiusura anticipata della sessione non dipende dal timeout di sessione ma dal riciclo dell'intera application, che ovviamente tira giù anche le sessioni.
a parte le varie impostazioni di IIS cè un altro fattore che comporta il riciclo e cioò la modifica di file o cartelle all'interno del percorso del sito, per farti un esempio banale basta che elimino ripetutamente diversi file (esempio modifico/elimino immagini) ed ecco che aspnet mi riavvia l'application.
Da quanto ho capito cè un oggetto che fà il monitoring della folder e dopo un tot di modifiche riavvia l'application, ho trovato diverse righe di codice in rete per poter ovviare a questo comportamento (praticamente permettono di fare lo stop del monitoring) solo che anche se in locale funzionano regolarmente su register generano un "Security Exception" .
probabilmente è un problema dovuto da come sono configurati i server web Aspnet su Register...




Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>probabilmente è un problema dovuto da come sono configurati i
>server web Aspnet su Register...
temo che su quello non hai controllo purtroppo.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

Facendo un paio di test più approfonditi ho scoperto che il problema si presenta sia su Aruba che su Register ma solo se il web server è configurato con la versione 4 di .Net e non con la 3.5, a titolo informativo se ti può tornare utile il codice utilizzato è il seguente:

PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
object o = p.GetValue(null, null);
FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
object monitor = f.GetValue(o);
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic);
m.Invoke(monitor, new object[] { });

in realtà ci sarebbe un altro sistema e cioè quello di escludere i percorsi interessati impostandoli in una apposita sezione del web.config solo che non si può fare nel web.config specifico dell'applicazione ma solo in quello di sistema (forse non è il termine giusto "sistema" comunque per intenderci quello di livello superiore), il che torniamo al problema di partenza, non potendo mettere mano sul webserver non posso modificarlo.
Non so se cè un altro modo per aggirare il problema, non credo, in rete ho trovato solo altre righe di codice leggermente diverse che generano sempre la stessa eccezione di sicurezza...

Andrea Restucci - Web Developer
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5