Короткий ответ
Существует в настоящее время (что я знаю) не простой способ продлить жизнь ASP.NET сессии одного. Существует одно возможное решение: используйте пользовательский поставщик хранилища сеансов!
Длинный ответ
Первые вещи сначала: Начните с того, что уже построен! Используйте образец Session-State Store Provider (and its tutorial), предоставленный Microsoft.Этот пример поставщика хранилища состояний сеанса использует Microsoft Access в качестве его задней части; хотя, поскольку он использует соединения ODBC, вы можете иметь фактически любой конец базы данных, поддерживаемый через установленные вами драйверы ODBC.
Этот пример поставщика хранилища состояний сеансов - это просто пользовательская версия того, что использует ASP.NET внутри (за исключением того, что ASP.NET работает в оперативной памяти).
Во-вторых: Подготовим требования доступа к базе данных и конфигурации.
Создайте таблицу, как указано в руководстве и в комментариях файла:
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)
)
ПРИМЕЧАНИЕ: Если вы хотите использовать SQL Server, просто замените текст (...) с VARCHAR (...), YesNo с немного и Memo с VARCHAR (MAX).
Добавить/обновить web.config
со следующим (вы можете использовать connectionstrings.com, чтобы помочь вам создать строку подключения):
<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>
Третье: Добавление функции, которая будет распространяться на больше, чем указано Timeout
.
Сделайте копию функции ResetItemTimeout
и назовите его 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();
}
}
Четвертое: Поддерживая расширение одного сеанса ASP.NET!
Всякий раз, когда вы потребность продлить сеанс, вызовите функцию ResetItemTimeout
следующим образом:
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);
Сноски
Прочитайте comments на странице с образцом Провайдер хранилища состояния сеанса;
Существует один потенциальный хороший вход около Ошибки в GetSessionStoreItem при использовании GetItem.
Другим хорошим является то, что Timestamps должен быть UTC.
Есть очевидные улучшения производительности/ремонтопригодность, что можно было бы сделать (особенно с наличием повторяющегося кода в ResetItemTimeout
и ResetItemTimeout2
).
У меня нет проверен этот код!
редактирует
- я понял, что я пропустил ту часть, где вы хотите, чтобы продлить болеечем
Timeout
- ответ был полностью обновлен.
- Добавлен раздел сносок.
Зачем мне увеличивать тайм-аут сеанса ?? Мне просто нужны они для 2 или 3 пользователей, которые также через неделю. Разве вы не думаете, что это будет пустая трата ресурсов? когда 99% пользовательского дозатора требуют длительной сессии. – Ratna