잘못된 ASP.NET 세션 데이터가 간헐적으로 반환됨

잘못된 ASP.NET 세션 데이터가 간헐적으로 반환됨

나는 페이지를 새로 고칠 때마다 사용자 세션이 변경되는 문제를 조사하는 임무를 맡았습니다. 즉시(웹사이트에 대해 아무것도 모르는 상태에서) 로드 밸런싱/웹 클러스터 구성 문제인 것 같다고 말했습니다. 하지만 나중에 알고 보니 해당 웹사이트는 로드 밸런싱이 되어 있지 않습니다. 단일 서버입니다.

응용 프로그램에는 Session에 저장되는 Basket 개체가 있습니다. 사용자가 장바구니 등에 항목을 추가합니다. 장바구니 페이지에 있을 때 페이지를 새로 고치면 장바구니에 있는 항목이 변경되고 때로는 아무것도 없는 경우도 있습니다.

세션은 손실되지 않으며 거의 ​​항상 다음 새로 고침 시 다시 돌아오지만 다음 새로 고침 시 장바구니가 비어 있거나 다른 콘텐츠를 가질 수 있습니다. 나는 이 동작을 여러 번 본 적이 있지만 다중 서버 설정에서만 보았습니다.

이것은 우리가 개발자 환경에서 복제하려고 시도했지만 성공하지 못한 것입니다. 문제를 복제할 수는 없지만 실제로는 이런 일이 많이 발생합니다.

웹 응용 프로그램은 Windows Server 2008 R2 및 IIS 7.5의 .NET 4.0에서 실행되는 ASP.NET WebForms 사이트입니다.

세션 상태 모드는 InProc이고 세션 시간 초과는 480분으로 설정됩니다.

요청과 응답을 살펴보기 위해 fiddler를 사용했는데 서버에 전달된 ASP.NET 세션 ID는 매번 동일합니다. 반환된 실제 HTML 외에는 응답 간에 차이가 없는 것 같습니다.

이 문제의 원인이 무엇인지 아는 사람이 있나요?

업데이트 1:

동료가 장바구니 코드에 구현한 로깅 중 일부를 다시 작업했습니다. 이제 세션 ID가 동일하게 유지되고, 다른 데이터가 표시되더라도 세션 변수의 값도 동일하게 유지되는 것을 볼 수 있습니다.

죄송합니다. 이 글을 게시하기 전에 로깅을 확인했어야 했습니다.

나는 이것이 서버 문제라고 확신합니다. 코드는 테스트 환경에서 예상대로 작동합니다.

답변1

"로드밸런싱/웹클러스터 구성 문제인 것 같다고 했는데요. 그런데 나중에 알고보니 해당 웹사이트는 로드밸런싱이 되지 않고 단일 서버입니다."

단일 서버라고 해서 로드 밸런싱이 진행되지 않는다는 의미는 아닙니다. IIS에는 웹 작업을 둘 이상의 프로세스로 분할하여 여러 CPU에 분산시킬 수 있는 "웹 가든"이라는 기능이 있습니다.

그것은 작은 "웹팜(Web Farm)"과 같아서 "웹가든(Web Garden)"이라는 이름이 붙었습니다. :)

웹 가든을 사용할 때의 효과는 InProc 세션 변수가 올바르게 작동하지 않게 한다는 것입니다. 각 페이지 요청마다 다른 작업자 프로세스가 발생할 수 있기 때문입니다. InProc(In Process)은 항상 종료되는 경우에만 안정적으로 작동합니다.동일한 프로세스에서.

해결 방법 1:

  • IIS가 웹 가든을 사용하도록 설정되어 있지 않은지 확인하세요. 이것을하기 위해:
    1. IIS 관리자를 엽니다.
    2. 웹 앱에서 사용 중인 앱 풀을 확인합니다.
    3. 앱 풀을 마우스 오른쪽 버튼으로 클릭하고 '를 선택하세요.고급 속성".
    4. 아래로 스크롤하여 "최대 작업자 프로세스" 에게 1.

앱 풀 설정

해결 방법 2:

  • 모든 작업자 프로세스의 세션 상태를 관리하는 것이 유일한 작업인 세션 상태 서버를 사용합니다.
  • 그런 다음 웹앱을 InProc에서 StateServer로 변경합니다.
  • 확인해 보세요세션 상태를 유지하도록 상태 서버 구성(IIS 7)그 일을 시작하려면. :)

이 MSDN 블로그를 확인하세요.진행 중인 세션 상태 관리

세션 상태 옵션과 InProc 세션 손실 문제를 해결하는 방법에 대해 설명합니다.

답변2

오랫동안 코드를 변경하지 않았습니다.(최종 변경일: 2016년 7월 20일)

하지만 Windows Server 2016에서도 동일한 문제가 있습니다. 고객은 Windows 2012 R2를 Windows 2016으로 업그레이드했습니다. 이 문제를 해결할 수 없었습니다.

그런 다음 이전 서버(Windows 2012 r2)로 다운그레이드합니다. 내 문제가 해결되었습니다. 버그인 것 같지만 확신할 수는 없습니다.

아마도 도움이 될 것입니다.

관련 정보