La risposta breve
C'è attualmente (che io sappia) modo semplice per prolungare la durata di una sessione di ASP.NET singola. Esiste una soluzione possibile: utilizzare un fornitore di negozio di stato sessione personalizzato!
La risposta lunga
Per prima cosa: Iniziare con qualcosa che è già costruito! Utilizzare l'esempio Session-State Store Provider (and its tutorial) fornito da Microsoft.Questo provider di negozio di stato di sessione di esempio utilizza Microsoft Access come il suo back-end; sebbene, poiché utilizza connessioni ODBC, è possibile avere virtualmente il back-end del database supportato tramite i driver ODBC installati.
Questo provider di negozio di stato di sessione di esempio è semplicemente una versione personalizzata di ciò che ASP.NET utilizza internamente (con l'eccezione che in esecuzione di ASP.NET in memoria).
In secondo luogo: Prepariamo i requisiti di database di Access e la configurazione.
Creare la tabella come specificato nel tutorial e nei commenti del file:
CREATE TABLE Sessions
(
SessionId Text(80) NOT NULL,
ApplicationName Text(255) NOT NULL,
Created DateTime NOT NULL,
Expires DateTime NOT NULL,
LockDate DateTime NOT NULL,
LockId Integer NOT NULL,
Timeout Integer NOT NULL,
Locked YesNo NOT NULL,
SessionItems Memo,
Flags Integer NOT NULL,
CONSTRAINT PKSessions PRIMARY KEY (SessionId, ApplicationName)
)
NOTA: Se si desidera utilizzare SQL Server, è sufficiente sostituire Testo (...) con varchar (...), YesNo con bit e Memo con varchar (MAX).
Add/aggiornare il web.config
con il seguente (è possibile utilizzare connectionstrings.com per aiutare a generare una stringa di connessione):
<configuration>
<connectionStrings>
<add name="OdbcSessionServices" connectionString="DSN=SessionState;" />
</connectionStrings>
<system.web>
<sessionState
cookieless="true"
regenerateExpiredSessionId="true"
mode="Custom"
customProvider="OdbcSessionProvider">
<providers>
<add name="OdbcSessionProvider"
type="Samples.AspNet.Session.OdbcSessionStateStore"
connectionStringName="OdbcSessionServices"
writeExceptionsToEventLog="false" />
</providers>
</sessionState>
</system.web>
</configuration>
Terzo: Aggiunta di una funzione che si estenderà per altro rispetto allo Timeout
specificato.
Eseguire una copia della funzione ResetItemTimeout
, e il nome ResetItemTimeout2
:
var ExtendedTotalMinutes = 2 * 60; // hours * minutes
public override void ResetItemTimeout2(HttpContext context, string id)
{
OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd =
new OdbcCommand("UPDATE Sessions SET Expires = ? " +
"WHERE SessionId = ? AND ApplicationName = ?", conn);
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value
= DateTime.Now.AddMinutes(ExtendedTotalMinutes); // IMPORTANT!! Set your total expiration time.
cmd.Parameters.Add("@SessionId", OdbcType.VarChar, 80).Value = id;
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = ApplicationName;
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (OdbcException e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "ResetItemTimeout");
throw new ProviderException(exceptionMessage);
}
else
throw e;
}
finally
{
conn.Close();
}
}
Quarto: Sostenere l'estensione di una singola sessione ASP.NET!
Ogni volta che si necessità di estendere una sessione, chiama la funzione ResetItemTimeout
come segue:
using Samples.AspNet.Session;
// from inside a User Control or Page
OdbcSessionStateStore.ResetItemTimeout2(this.Context, this.Session.SessionID);
// --or--
// from anywhere else
OdbcSessionStateStore.ResetItemTimeout2(System.Web.HttpContext.Current, System.Web.HttpContext.Current.Session.SessionID);
Note
Leggere il comments sulla pagina con il campione Provider del negozio di stato di sessione;
ci sono evidenti miglioramenti delle prestazioni/manutenibilità che potrebbe essere fatto (in particolare di avere il codice duplicato in ResetItemTimeout
e ResetItemTimeout2
).
Ho non testato questo codice!
modifiche
- mi sono reso conto che ho perso la parte in cui si desidera estendere più rispetto al
Timeout
- risposta è stato completamente aggiornato.
- Aggiunta la sezione delle note a piè di pagina.
Perché dovrei aumentare il timeout della sessione ?? Ho solo bisogno di loro per 2 o 3 utenti che anche in una settimana. Non pensi che sarà uno spreco di risorse ?? quando il 99% del dosatore dell'utente richiede una sessione lunga. – Ratna