asp.net 中设置 session 当天过期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 中设置 session 当天过期相关的知识,希望对你有一定的参考价值。

asp.net 中设置 session 当天过期
不管是一天中几点设置的session 都在当天夜里12点过期,有办法解决嘛?
请注意看问题,过期时间不是固定的,而时间点是固定的怎么设置

参考技术A ASP.NET session时间的设置
方法一:

asp.net Session的默认时间设置是20分钟,即超过20分钟后,服务器会自动放弃Session信息.
当我们在asp.net程序中打开webconfig的时候,可以看到一段如下的代码:

Asp.net程序代码:
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>

设置timeout="20"

ASP.NET session时间的设置方法二: 不过有时修改配置文件不能很好的解决这个问题。你可以在公共程序里Global.asax里修改。我们在找到global.asax中找到 Session_Start后 按如下设置一下就可以了。

void Session_Start(object sender, EventArgs e)

// 在新会话启动时运行的代码
Session.Timeout = 600;

要是设置无效,,就参考一下http://www.2cto.com/kf/201102/83863.html本回答被提问者和网友采纳
参考技术B 来学习的 参考技术C 配置文件里不是有设置的吗

更改 ASP.NET 缓存项过期的频率?

【中文标题】更改 ASP.NET 缓存项过期的频率?【英文标题】:Changing frequency of ASP.NET cache item expiration? 【发布时间】:2010-09-21 01:46:35 【问题描述】:

我注意到 ASP.NET 缓存项每 20 秒检查一次(并且可能会被删除)(奇怪的是每次都在 HH:MM:00、HH:MM:20 和 HH:MM:40)。我花了大约 15 分钟寻找如何更改此参数,但没有成功。我还尝试在 web.config 中设置以下内容,但没有帮助:

<cache privateBytesPollTime="00:00:05" />

我并不想做任何疯狂的事情,但是如果它是 5 秒而不是 20 秒,或者对于我的应用程序来说至少是 10 秒,那就太好了。

【问题讨论】:

【参考方案1】:

使用 Reflector 进行探索发现间隔是硬编码的。过期由内部CacheExpires 类处理,其静态构造函数包含

_tsPerBucket = new TimeSpan(0, 0, 20);

_tsPerBucketreadonly,所以以后不能有任何配置设置修改它。

然后在CacheExpires.EnableExpirationTimer()...中设置将触发检查过期项目的计时器...

DateTime utcNow = DateTime.UtcNow;
TimeSpan span = _tsPerBucket - new TimeSpan(utcNow.Ticks % _tsPerBucket.Ticks);
this._timer = new Timer(new TimerCallback(this.TimerCallback), null,
    span.Ticks / 0x2710L, _tsPerBucket.Ticks / 0x2710L);

span 的计算确保计时器准确地在 :00、:20、:40 秒触发,但我看不出有任何打扰的理由。定时器调用的方法是internal,所以我认为没有办法设置自己的定时器来更频繁地调用它(忽略反射)。

不过,好消息是您不应该真的有任何理由关心间隔。 Cache.Get() 检查项目是否过期,如果过期则立即从缓存中删除项目并返回 null。因此,您永远不会从缓存中获取过期项目,即使过期项目可能会在缓存中停留长达 20 秒。

【讨论】:

【参考方案2】:

根据documentation,privateBytesPollTime 用于“工作进程内存使用”,默认为 1 秒。我认为这与缓存项删除无关。

我确实使用项目删除回调确认了您的结果 - 看起来项目在分钟的底部、:20 和 :40 秒被删除。这表明项目可能会在缓存中保留长达 20 秒,超过对它们设置的 AbsoluteExpiration。我找不到任何说明是否可以更改 20 秒轮询间隔的文档。

【讨论】:

【参考方案3】:

疯狂但有效的解决方案(需要所有步骤):

// New value for cache expiration cycle
// System.Web.Caching.CacheExpires._tsPerBucket;
// Set 1 seconds instead of 20sec
const string assembly = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
var type = Type.GetType("System.Web.Caching.CacheExpires, " + assembly, true, true);
var field = type.GetField("_tsPerBucket", BindingFlags.Static | BindingFlags.NonPublic);
field.SetValue(null, TimeSpan.FromSeconds(1));

// Recreate cache
// HttpRuntime._theRuntime._cacheInternal = null;
// HttpRuntime._theRuntime._cachePublic = null;
type = typeof (HttpRuntime);
field = type.GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
var runtime = field.GetValue(null);
field = type.GetField("_cachePublic", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(runtime, null);
field = type.GetField("_cacheInternal", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(runtime, null);

【讨论】:

以上是关于asp.net 中设置 session 当天过期的主要内容,如果未能解决你的问题,请参考以下文章

jsp 中设置session中 某一值的过期时间

asp.net当我在web.config中设置“sessionState mode=StateServer”

C#在控制器中设置session过期时间为2小时,为啥实际应用中20分钟session就消失了?,

Java中设置Session过期时间(Spring Boot)

如何在 django 中设置会话永不过期

更改 ASP.NET 缓存项过期的频率?