我们刚刚从旧的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]
表中的数据库中使用主键具有相同的条目。
问题:谁负责删除该数据库条目?我知道如果正确启动注销,它应该被代码消除。但是,如果它已经存在,是否应该有一些自动错误处理(在成员资格本身)?如果是,为什么不触发?如果不是,我该如何添加?
答案 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();
}