1

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

现在,如果站点意外关闭,(比如调试 => 停止)当我们恢复时,我们会收到错误: 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]带有主键的表内的数据库中具有相同的条目。

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

4

1 回答 1

1

清除过期会话是 ASPState 数据库中包含的 SQL Server 代理的工作。您不必添加它。

会话过期 - SqlSessionStateStore

更新:2012 年 12 月 19 日

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();
}
于 2012-12-18T19:59:43.350 回答