1

SQLターゲットがAzureSQLであるため、古いASP.NETメンバーシップ(MVC3から)から新しいASP.NETユニバーサルプロバイダーに移行しました。その移動中のSQLスクリプトは-苦痛でした!とにかく、セッション状態をSQLに設定します(つまり<sessionState mode="Custom"、web.confgで)。

ここで、サイトが予期せずダウンした場合(たとえば、debugging => 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]予想どおり、セッションのテーブル内のデータベースに主キーと同じエントリがあることを確認しました。

質問:そのdbエントリを削除するのは誰の責任ですか?ログアウトが適切に開始されれば、コードによって消去されるはずです。しかし、すでに存在する場合に備えて、(メンバーシップ自体で)自動エラー処理を行うべきではありませんか?はいの場合、なぜトリガーされないのですか?いいえの場合、どうすれば追加できますか?

4

1 に答える 1

1

期限切れのセッションのパージは、ASPStateデータベースに含まれるSQLServerエージェントのジョブです。追加する必要はありません。

セッションの有効期限-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 に答える