创建到期的ASP.NET会话值

时间:2009-03-13 12:36:53

标签: asp.net vb.net

我想创建一个在5分钟后过期的会话值。

如何做到这一点,我在阅读时是否需要手动比较创建时间?

Session("sessionval") = myvariable
Session("sessioncreated") = now

7 个答案:

答案 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分钟。