我想创建一个在5分钟后过期的会话值。
如何做到这一点,我在阅读时是否需要手动比较创建时间?
Session("sessionval") = myvariable
Session("sessioncreated") = now
答案 0 :(得分:6)
如果您询问如何在单个变量上执行此操作,我认为不可能,但您可以使用web.config定义会话超时期限
<system.web>
<sessionState timeout="5" />
<system.web>
这会影响您的所有会话对象,而不仅仅是单个会话对象。
我建议为单个项目提供自定义到期日期是建立一个cookie,这样您就可以实际设置它的到期值。
Response.Cookies.Add(New Web.HttpCookie("AdminID", admin.AdminID))
Response.Cookies("AdminID").Expires = Now.AddMinutes(5)
答案 1 :(得分:3)
您无法为会话变量定义自定义超时。
也许您可以使用缓存,使用依赖于会话的唯一键。
您可以将超时设置为缓存项目。
Cache.Insert("key_dependent_to_session", value, Nothing,
DateTime.Now.AddMinutes(5), TimeSpan.Zero)
答案 2 :(得分:3)
如果你想使用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));
答案 3 :(得分:2)
这是正确的。会话状态没有Expiration概念。
如果您的数据不是每个用户,则可以使用Cache。您甚至可以使用缓存,但是将用户名包含在密钥的一部分中,这会使您的会话状态过期。
答案 4 :(得分:1)
我倾向于同意TheTXI。
虽然无法为单个会话项分配自定义超时,但应注意在InProc会话模式下,Sessionstate本身作为项添加到ASP.NET缓存中。这使它具有“超时”。
在您的特定场景中,Cache对象是最适合的解决方案。
答案 5 :(得分:0)
很抱歉重新提出一个旧问题,但我遇到了完全相同的问题,不得不为HttpSession对象创建一个扩展类。
Here's my blog article on this
PS。代码:
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;
}
}
答案 6 :(得分:-1)
1)把它放在web.config
中<configuration>
<system.web>
<sessionState mode="InProc" timeout="5">
</sessionState>
</system.web>
</configuration>
2)设置System.Web.SessionState.HttpSessionState.Timeout = 5分钟。