2012-12-14 6 views
1

SQL 타겟이 Azure SQL이므로 이전 ASP.NET 멤버 (MVC3에서)를 새 ASP.NET 범용 공급자로 마이그레이션했습니다. 그 이동 중 SQL 스크립트는 고통 스러웠습니다! 어쨌든 세션 상태를 SQL로 설정합니다 (예 : web.confg의 <sessionState mode="Custom"). 우리가 다시 시작할 때ASP.NET 유니버설 공급자 : 세션 상태가 삭제되지 않습니까?

지금 사이트가 갑자기 다운되면, (예를 들어 디버깅 => 정지) 우리가 오류를 얻을 : 예상대로 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에서 동일한 항목이 있는가 확인 기본 키가있는 [db].[SessionId] 테이블 내부.

질문 : 누가 해당 DB 항목을 삭제해야합니까? 로그 아웃이 제대로 시작되면 코드로 지워 져야한다는 것을 이해합니다. 그러나 이미 존재하는 경우 자동 오류 처리 (멤버십 자체에서)가 없어야합니까? 그렇다면 왜 그것이 실행되지 않습니까? 아니요, 어떻게 추가 할 수 있습니까?

답변

1

만료 된 세션을 제거하면 SQL Server 에이전트의 작업이 ASPState 데이터베이스에 포함됩니다. 추가 할 필요가 없습니다.

Session Expiration - 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(); 
} 
+0

감사합니다. 데이터베이스가 Azure SQL에있을 때 해당 작업을 활성화하는 방법을 알고 계십니까? 또한, 새로운 유니버설 공급자는 (이전과 달리) 저장 프로 시저를 추가하지 않는다고 생각합니다. 그래서 이것은 훨씬 더 당혹 스럽네하는 그런 직업을 가질 수있는 능력을 만듭니다. – DeepSpace101

+0

나는 대답을 업데이트했습니다. Azure를 사용하는 경우 캐시 방법에 ASP.NET 세션 상태 저장 http://www.windowsazure.com/en-us/develop/net/how-to-guides/cache/# 상점 세션 – Win

관련 문제