2011-10-13 3 views
0

정말 이상한 ASP.net 간헐적 인 세션 지속성 문제가 있습니다. 먼저 몇 가지 사실 :매우 특이한 ASP.net 세션 변수 지속성

환경 : 끈적 세션과

  • F5로드 밸런서가 활성화 :
  • 웹 서버 : 2 * 윈도우 서버 2008 R2,
  • .NET Framework 버전 : 2.0.50727, IIS7,
  • 데이터베이스 서버 : SQL Server 2008 R2
  • 세션 프로토콜 : ASP.net InProc 세션, 20 분으로 설정된 시간 초과, cookieless = false
  • CMS : 문제와에 400.net

좋아는 Ektron CMS.

우리는 장바구니에 대해 웹 사이트에서 설정 한 몇 가지 사용자 지정 VB.net 세션 값을 가지고 있습니다. 때로는 이러한 변수 중 일부가 지속성을 잃는 것처럼 보입니다. 메인 세션이 계속 유지되기 때문에 몇 가지를 말합니다.

예 : 내가 추적을 실행할 때이 세션 객체가 지속적으로 남아있는 경우에도

Shared Sub New() 
    ' If the cart is not in the session, create one and put it there 
    ' Otherwise, get it from the session 
    If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then 
     Instance = New ShoppingCart() 
     Instance.Items = New List(Of CartItem) 
     HttpContext.Current.Session("ASPNETShoppingCart") = Instance 
    Else 
     Instance = CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart) 
    End If 

End Sub 

, 그것은 표시되지 않습니다 : 나는 주범이 동료라고 생각합니다

Session ("userId")과 같은 다른 세션 변수가 세션 ("ASPNETShoppingCart")에 대한 값을 보지 못하는 동안 추적에 표시됩니다. - 내가 이상하다고 생각한 이유는 아마도 이것은 반대의 객체이기 때문입니다 문자열에?

로드 밸런서를 직접 우회하여 코드를 서버에서 직접 호출하여 문제를 배제했습니다.

나는 여전히 로그인되어 있고 다른 세션 값이 화면에 나타나기 때문에 문제가 발생하면 전체 세션이 파괴되지 않는다는 것을 알고 있지만 장바구니 값은 표시되지 않습니다.

이런 문제가 발생할 수있는 이유는 무엇입니까? 세션 변수를 보호하는 방법이 있습니까? 아니면 적어도 상태를 변경하면 통지를 받으면서이 문제의 원인을 추적 할 수 있습니까?

답변

1

실제로 "일부 변수"가 손실되거나 일부 변수가 이상하지 않습니다.

"사용자 ID"(예 : 인증 쿠키에서)를 다시 만드는 일종의 "폴백 (fallback)"메커니즘이있을 수 있으며 다른 개체에 대해서는 이와 같은 일이 발생하지 않을 수도 있습니다.

일반적으로 asp.net Worker 프로세스가 재활용 될 때마다 언제든지 InProc 세션 상태를 사용하지 않는 것이 좋으며 언제든지 발생할 수 있으므로 세션의 모든 내용이 손실됩니다. 고정 세션을 사용하기 때문에 내 제안은 로컬 StateServer을 사용하여 OutOfProcess 모드로 전환하는 것입니다. more here.을 읽을 수 있습니다. 구성하는 것이 매우 간단합니다. Web.config를 변경하고 ASP.NET 상태 서비스가 서버에서 시작되는지 확인합니다.

유일한주의 사항은 모든 객체를 직렬화해야하지만, 세션에 이국적인 것을 저장하지 않는다면 객체를 [Serializable] 속성으로 꾸미기 만하면됩니다.

+0

안녕하세요 이카루스, 의견에 감사드립니다. 내 프로토콜을 OutofProcess로 전환하고 DB에 저장하는 것을 실제로 고려했습니다.하지만 '핵'옵션을 사용하기 전에이 세션 객체가 왜 지속성을 잃어버린 것인지 정확히 지적하고자합니다. 이상하게도 프로덕션 서버의 다른 미러에서이를 다시 만들 수는 없습니다. 같은 코드, 동일한 db 등등. IIS 설정, 세션을 방해하는 Windows 서비스, 일부 바이러스 백신 또는 방화벽의 차이 (생각을하게됩니다!)와 같은 환경 변수라고 생각하고 있습니다. –

+0

생산하지만 생산 환경과 동일한 적재 조건을 재현 할 수 있어야합니다. 프로덕션 서버에 바이러스 백신이 없기를 바랍니다. 나는 이런 일을하는 사람에게 매우 화가 났을 것입니다. – Icarus

+0

그래서 나는 - 나는 주된 생산 환경의 sys 관리 요소를 스스로 제어하지 않으므로 나는 아무것도 배제 할 수 없다! –