asp.net 中设置 session 当天过期
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 中设置 session 当天过期相关的知识,希望对你有一定的参考价值。
asp.net 中设置 session 当天过期
不管是一天中几点设置的session 都在当天夜里12点过期,有办法解决嘛?
请注意看问题,过期时间不是固定的,而时间点是固定的怎么设置
方法一:
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);
_tsPerBucket
是readonly
,所以以后不能有任何配置设置修改它。
然后在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 当天过期的主要内容,如果未能解决你的问题,请参考以下文章
asp.net当我在web.config中设置“sessionState mode=StateServer”
C#在控制器中设置session过期时间为2小时,为啥实际应用中20分钟session就消失了?,