ASP.NET Universal Providers:会话状态不会被删除?

时间:2012-12-14 04:59:01

标签: session asp.net-membership

我们刚刚从旧的ASP.NET成员资格(从MVC3)迁移到新的ASP.NET通用提供程序,因为我们的SQL目标是Azure SQL。移动过程中的SQL脚本很痛苦!无论如何,我们将会话状态设置为SQL(即web.confg中的<sessionState mode="Custom")。

现在,如果网站意外停止,(比如debugging =&gt; stop),我们恢复时会收到错误消息: Violation of PRIMARY KEY constraint 'PK__Sessions__C9F492908756A0EE'. Cannot insert duplicate key in object 'dbo.Sessions'. The duplicate key value is (<randomstring>). The statement has been terminated.

正如预期的那样,我确认会话确实在[db].[SessionId]表中的数据库中使用主键具有相同的条目。

问题:谁负责删除该数据库条目?我知道如果正确启动注销,它应该被代码消除。但是,如果它已经存在,是否应该有一些自动错误处理(在成员资格本身)?如果是,为什么不触发?如果不是,我该如何添加?

1 个答案:

答案 0 :(得分:1)

清除过期的会话是SQL Server Agent的作业,包含在ASPState数据库中。你不必添加它。

Session Expiration - SqlSessionStateStore

更新:12/19/2012

DefaultSessionStateProvider中,每个请求都会清除过期的会话。

public override void InitializeRequest(HttpContext context)
{
    this.PurgeIfNeeded();
}

private void PurgeExpiredSessions()
{
    bool flag;
    SessionEntities sessionEntity = ModelHelper.CreateSessionEntities(this.ConnectionString);
    try
    {
        DateTime utcNow = DateTime.UtcNow;
        IQueryable<Session> expiredSessions = QueryHelper.GetExpiredSessions(sessionEntity);
        IEnumerator<Session> enumerator = expiredSessions.GetEnumerator();
        try
        {
            while (true)
            {
                flag = enumerator.MoveNext();
                if (!flag)
                {
                    break;
                }
                Session current = enumerator.Current;
                sessionEntity.DeleteObject(current);
            }
        }
        finally
        {
            flag = enumerator == null;
            if (!flag)
            {
                enumerator.Dispose();
            }
        }
        sessionEntity.SaveChanges();
    }
    finally
    {
        flag = sessionEntity == null;
        if (!flag)
        {
            sessionEntity.Dispose();
        }
    }
}

private void PurgeIfNeeded()
{
    this.PurgeExpiredSessions();
}
相关问题