会话超时仅对一个变量不同

时间:2014-03-25 08:24:42

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

Cookie 中,我们可以使用Expireshttp://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。

默认情况下是否有解决方案?

2 个答案:

答案 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版本(没有异步代码,没有任务),那么您也可以在链接下找到兼容版本。