简短的回答
目前(据我所知)没有简单的方法可以延长单个ASP.NET 会话的寿命。有一种可能的解决方案:使用自定义的 Session-State Store Provider!
长答案
首先要做的事情:从已经构建的东西开始!使用Microsoft 提供的示例Session-State Store Provider(及其教程)。此示例 Session-State Store Provider使用 Microsoft Access 作为其后端;不过,由于它使用 ODBC 连接,因此您几乎可以通过已安装的 ODBC 驱动程序支持任何数据库后端。
此示例会话状态存储提供程序只是 ASP.NET 内部使用的自定义版本(ASP.NET 在内存中运行的例外)。
其次:让我们准备 Access 数据库的要求和配置。
按照教程和文件注释中的说明创建表:
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,只需将Text(...)替换为varchar(...),将 YesNo 替换为bit,将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 Session的扩展!
每当您需要扩展会话时,请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);
脚注
使用示例 Session-State Store Provider阅读页面上的评论;
可以进行明显的性能/可维护性改进(尤其是在 和 中有重复代码的情况下ResetItemTimeout
)ResetItemTimeout2
。
我没有测试过这段代码!
编辑
- 我意识到我错过了您想要扩展的部分-答案
Timeout
已完全更新。
- 添加脚注部分。