我想创建一个会话值,它在5分钟后过期。
如何做到这一点?我需要在读取时手动比较创建时间吗?
Session("sessionval") = myvariable
Session("sessioncreated") = now
<system.web>
<sessionState timeout="5" />
<system.web>
这将影响所有的会话对象,而不仅仅是单个对象。
我建议为单个项目设置自定义过期日期的方法是创建一个 cookie,这样您可以真正地设置其到期值。
Response.Cookies.Add(New Web.HttpCookie("AdminID", admin.AdminID))
Response.Cookies("AdminID").Expires = Now.AddMinutes(5)
您不能为会话变量定义自定义超时时间。
也许您可以使用缓存来实现,使用一个依赖于会话的唯一键。
您可以为缓存项目设置超时时间。
Cache.Insert("key_dependent_to_session", value, Nothing,
DateTime.Now.AddMinutes(5), TimeSpan.Zero)
如果您想使用SessionState,可以创建自己的包装器,以便于缓存包装器而不是实际项。这里是一个快速简单的未经测试的包装器示例,它检查项目是否为空,或者是否已过期,如果是,则调用一个可以提供刷新项的Func。
Func获取上次设置的值,因此如果您可以确定该值仍然有效,则可以避免重新加载它。
public class TimeExpirationItem<T>
{
private T _item=default(T);
private TimeSpan _expirationDuration;
private Func<T> _getItemFunc;
private DateTime _expiresTime;
public TimeExpirationItem(TimeSpan expirationDuration, Func<T, T> getItemFunc)
{
this._getItemFunc = getItemFunc;
this._expirationDuration = expirationDuration;
}
public T Item
{
get
{
if (_item == null || ItemIsExpired())
{
_item = _getItemFunc(_item);
_expiresTime = DateTime.Now.Add(_expirationDuration);
}
return _item;
}
}
public bool ItemIsExpired()
{
return DateTime.Now > _expiresTime;
}
}
再次提醒,此代码不带任何保证和测试,但是它是你可以做的事情的示例。
使用方法如下:
Session.Add("ObjectKey", new TimeExpirationItem<MyObject>(new TimeSpan(0, 0, 5), mo=>MyObjectRepository.GetItemByLogin(Request.User.Identity.Name));
抱歉挖掘一个旧问题,但我面临完全相同的问题,不得不为HttpSession对象创建一个扩展类。
附:代码:
public static class SessionExtender
{
public static void AddWithTimeout(this HttpSessionState session,
string name,
object value,
TimeSpan expireAfter)
{
session[name] = value;
session[name + "ExpDate"] = DateTime.Now.Add(expireAfter);
}
public static object GetWithTimeout(
this HttpSessionState session,
string name)
{
object value = session[name];
if (value == null) return null;
DateTime? expDate = session[name + "ExpDate"] as DateTime?;
if (expDate == null) return null;
if (expDate < DateTime.Now)
{
session.Remove(name);
session.Remove(name + "ExpDate");
return null;
}
return value;
}
}
没错。会话状态没有过期的概念。
如果您的数据不是基于用户的,可以使用缓存代替。甚至可以使用缓存,但将用户名作为键的一部分,这样就可以获得类似于过期会话状态的效果。
我倾向于同意TheTXI的观点。
虽然单个Session项不能分配自定义超时时间,但需要注意的是,在InProc会话模式中,Sessionstate本身就被添加为ASP.NET缓存的一个项目。这使得它可以具有"超时"。
在您特定的情况下,Cache对象是最适合的解决方案。
1) 将此内容放入 web.config 文件中
<configuration>
<system.web>
<sessionState mode="InProc" timeout="5">
</sessionState>
</system.web>
</configuration>
2) 将System.Web.SessionState.HttpSessionState.Timeout设置为5分钟。