在 Cookie 中,我们可以使用Expires
(http://msdn.microsoft.com/en-us/library/system.net.cookie.expires%28VS.80%29.aspx)来定义到期日期。
在.Net 4.0(MVC)中,是否可以为一个变量定义会话超时?
我真的不喜欢有类似的东西:
session["VariableCreatedOn"] = DateTime.Now()
session["VariableValue"] = xxx
然后尝试验证VariableCreatedOn
是否早于XYZ。
默认情况下是否有解决方案?
答案 0 :(得分:2)
不,当会话的其余部分继续存在时,不可能直接使一个会话变量过期,反之亦然。
然而,您可以将此逻辑包装在自定义类中并将该类的对象存储在会话中(而不是存储值和到期日期),而不必检查该值是否已遍及该位置。或创建日期作为两个单独的值。)
它类似于可以为null的值类型,因为你在该类上有一个Value属性,并且该属性的getter将返回一个值或返回null,具体取决于内部CreationDate属性的值
未经测试的代码如下;根据您的具体需求进行调整。
public class ExpiringSessionValue<T>
{
private T _value;
private DateTime _created = DateTime.Now;
public ExpiringSessionValue(T value)
{
_value = value;
}
public T Value
{
get
{
if (_created >= DateTime.Now.AddMinutes(-10))
return _value;
else
return default(T);
}
}
}
答案 1 :(得分:2)
没有内置方式,但你可以很简单地实现它:
Session[name] = value;
//now add a cleanup task that will run after the specified interval
Task.Delay(expireAfter).ContinueWith((task) => {
Session.Remove(name);
});
我将它包装成一个非常方便的会议扩展器&#34; class here像这样使用它:
//store and expire after 5 minutes
Session.AddWithTimeout("key", "value", TimeSpan.FromMinutes(5));
PS。如果您仍在使用旧的.NET版本(没有异步代码,没有任务),那么您也可以在链接下找到兼容版本。