세션 상태 손실
저는 ASP.net 애플리케이션을 가지고 있는데, 사용자가 특정 작업을 성공적으로 완료할 수 없는 이유는 세션 손실(현재 사용자 정보를 유지하는 위치 및 로그인 여부를 확인하는 방법)과 관련이 있을 수밖에 없습니다.
저는 그들이 왜 그들의 세션을 잃었는지에 대해 막막합니다. 그래서 저의 첫 번째 질문은:
(일반적으로) 사용자가 ASP.net 에서 세션을 잃게 되는 원인은 무엇입니까?
사용자가 세션을 잃어버려 직접 복제할 수 없는 경우를 모르기 때문입니다.
사용자가 세션을 잃었을 때 추적하려면 어떻게 해야 합니까?
다음은 참조용으로 내 sessionState 구성입니다.
<sessionState
mode="InProc"
cookieless="false"
cookieName="My.Site.Com"
timeout="480"/>
세션 상태가 신비롭게 사라지는 원인은 여러 가지가 있습니다.
- sessionState 시간 초과가 만료되었습니다.
- 앱도메인을 재활용하는 web.config 또는 기타 파일 형식을 업데이트합니다.
- IIS의 앱 풀이 재활용됩니다.
- 많은 파일로 사이트를 업데이트하면 ASP.NET은 메모리를 재컴파일하고 보존하기 위해 AppDomain을 사전에 삭제합니다.
-
IIS 7 또는 7.5를 사용하는 경우 다음과 같은 몇 가지 사항을 확인할 수 있습니다.
- 기본적으로 IIS는 일정 기간 동안 사용하지 않으면 AppPool이 자동으로 꺼지도록 설정합니다.
- 기본적으로 IIS는 1740분마다 AppPool을 재활용하도록 설정합니다(분명히 루트 구성에 따라 다르지만 기본값임).
- IIS에서 AppPool의 "고급 설정"을 확인합니다.여기에는 "유휴 시간 제한"이라는 속성이 있습니다.이 값을 0으로 설정하거나 기본값(20)보다 높은 숫자로 설정합니다.
- IIS에서 AppPool의 "재활용" 설정을 확인합니다.여기서 AppPool의 재활용을 활성화하거나 비활성화할 수 있습니다.마법사의 두 번째 페이지는 각 유형의 AppPool 종료 이벤트 로그에 기록하는 방법입니다.
IIS 6을 사용하는 경우 동일한 설정이 적용되지만(대부분의 경우 동일한 설정에 액세스하는 방법이 다름) 재활용 로그를 기록하는 것이 더 어렵습니다.다음은 IIS 6에서 AppPool 재활용 이벤트를 기록하는 방법에 대한 링크입니다.
-
웹 앱에서 파일을 업데이트하는 경우 모든 세션이 손실될 것으로 예상해야 합니다.그것이 바로 짐승의 본성입니다.그러나 여러 번 발생할 것으로 예상하지 못할 수도 있습니다.15개 이상의 파일(aspx, dll 등)을 업데이트하는 경우 사이트에 액세스하는 사용자에 의해 페이지가 다시 컴파일되므로 일정 기간 동안 여러 번 재시작될 가능성이 있습니다.다음 두 링크를 참조하십시오.
http://support.microsoft.com/kb/319947
numCompilesBeforeAppRestart를 더 큰 숫자로 설정하거나 AppPool을 수동으로 바운스하면 이 문제가 해결됩니다.
-
세션이 생성되거나 종료될 때 알림이 표시되도록 Application_SessionStart 및 Application_SessionEnd를 항상 처리할 수 있습니다.HttpSessionState 클래스에는 페이지 요청 시 활성 사용자에 대한 새 세션이 생성되었는지 확인할 수 있는 IsNewSession 속성도 있습니다.
-
마지막으로 귀하의 상황에서 가능하다면 SQL Server 세션 모드를 성공적으로 사용했습니다.대량의 데이터를 저장하는 경우(모든 요청이 SQL Server에서 전체 데이터를 로드 및 저장) 권장하지 않으며, 사용자 지정 개체를 저장하는 경우(직렬 가능해야 하므로) 번거로울 수 있습니다.몇 시간 동안 재활용하지 않도록 AppPool을 구성할 수 없는 공유 호스팅 시나리오에서 도움이 되었습니다.저의 경우, 제한된 정보를 저장했으며 성능에 악영향을 미치지 않았습니다.여기에 기존 사용자가 세션을 재사용한다는 사실도 추가합니다.기본적으로 ID이며 사용자는 모든 상태가 SQL Server에 저장되어 있기 때문에 AppPool 재활용에 의해 메모리 내 세션이 삭제되었다는 사실을 전혀 눈치채지 못했습니다.
ASP.NET 4.0에서는 모든 페이지 요청에서 세션이 재설정되고 SESSION_START 코드가 각 페이지 요청에서 실행되는 상황이 발생했습니다.이는 모든 세션에서 모든 사용자에게 발생한 것은 아니지만, 일반적으로 발생했으며, 발생한 경우 각 페이지 요청에서 발생했습니다.
내 web.config sessionState 태그의 설정은 위에서 언급한 설정과 동일합니다.
cookieless="false"
다음으로 바꿨을 때...
cookieless="UseCookies"
문제가 해결되는 것 같았습니다.ASP.NET 1의 이전 선택은 true|false였습니다.ASP.Net 2.0부터 열거된 선택 항목을 사용할 수 있게 되었습니다.이 옵션들은 더 이상 사용되지 않는 것 같습니다."false" 값은 과거에 문제를 일으킨 적이 없습니다. ASP.NET 4.0에서만 확인할 수 있습니다.4.0에서 더 이상 올바르게 지원하지 않는 무언가가 변경되었는지 모르겠습니다.
또한, 저는 얼마 전에 이것을 발견했습니다.이전에는 문제가 간헐적으로 발생했기 때문에 여전히 발생할 수 있다고 생각하지만, 현재까지는 이 새로운 설정으로 작동하고 있습니다.
나의 경우 AppPool->고급 설정->최대 작업자 프로세스를 1로 설정하는 것이 도움이 되었습니다.
세션이 손실되었습니다. 왜냐하면...
런타임 오류가 없는지 확인하십시오. 치명적인 예외가 발생하면 세션이 중지됩니다!
Microsoft 스택에서 Visual Studio - Ctrl + Alt + E - 모든 예외를 켠 다음 디버깅 모드에서 코드를 실행합니다.모든 치명적인 것이 세션 손실의 원인입니다.
Session_Start and Application_Start의 Global.asax에 로깅을 추가하여 사용자의 세션 및 응용 프로그램 전체에서 진행 중인 작업을 추적할 수 있습니다.
또한 웹 팜 모드(애플리케이션 풀에 정의된 여러 IIS 스레드) 또는 로드 밸런싱에서 실행 중인 경우 동일한 메모리가 없는 다른 서버에 도달할 수 있으므로 주의하십시오.이 경우 세션 모드를 SQL 서버로 전환할 수 있습니다.
문자열이나 정수가 아닌 데이터 행인 세션만 손실되었습니다.데이터를 직렬화 가능한 개체에 저장하고 세션에 저장하는 것이 제게 도움이 되었습니다.
Ajax를 통해 콘텐츠를 검색할 때 IIS 8에서 문제가 발생했습니다.문제는MaximumWorkerProcesses
로 설정되었습니다.2
자바스크립트는 17개의 동시 요청을 열었습니다.이는 AppPool에서 처리할 수 있는 수준을 초과했으며 인증 데이터가 없는 새 풀이 열렸습니다.
솔루션은 변경이었습니다.MaximumWorkerProcesses
로.0
에IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses
.
문제와 관련이 있는지 모르겠지만 Windows 2008 Server R2 또는 SP2가 IIS 설정을 변경하여 세션 지속성에 문제가 발생했습니다.기본적으로 HTTP 및 HTTPS에 대한 별도의 세션 변수를 관리합니다.HTTPS에서 변수를 설정하면 변수를 전환할 때마다 HTTPS 페이지에서만 사용할 수 있습니다.
이 문제를 해결하기 위해 IIS 설정이 있습니다.IIS 관리자에서 ASP 속성을 열고 세션 속성을 확장한 다음 보안 연결 시 새 ID를 거짓으로 변경합니다.
저도 세션이 끊기는 것과 같은 문제를 겪었습니다.매번, 모든 페이지를 다시 로드하고, 세션을 지우고, 새로운 페이지를 다시 로드하면 세션이 유효한 값으로 반환됩니다.
iis에서 MaximumWorkerProcesses를 0에서 1로 변경하여 수정했습니다.
저는 이 문제로 14일 동안 고생했습니다.
도움이 된 것은 다음과 같습니다.
- App Pool > Advanced 설정에서 재활용 옵션을 확인합니다.자동으로 재활용되지 않도록 모든 옵션을 해제합니다.
- 를 확인해 .
web.config
의 파일입니다.executionTimeout
의httpRuntime
그리고 그 가치를 높입니다. - 를 확인해 .
web.config
의 파일입니다.timeout
의sessionState
값을 늘립니다(300분으로 설정했습니다). - 서버의 이벤트 로그로 이동하여 응용프로그램 로그에서 작업자 프로세스가 중단될 수 있는 처리되지 않은 예외를 확인합니다.하거나 코에서나사용거수를 합니다.
try
그리고.catch
이 충돌을 제거하기 위해. - 최대 작업자 프로세스의 값을 다음에서 변경해 보십시오.
0
1
또는 반대로, 이것은 또한 이 문제를 해결할 수 있습니다.
이 경우 로드 밸런서로 인해 세션 상태가 느려졌습니다.세션이 한 서버에 저장되고 로드 밸런서가 세션 상태가 누락된 다른 서버로 다음 호출을 리디렉션하고 있습니다.
언급URL : https://stackoverflow.com/questions/3515947/losing-session-state
'programing' 카테고리의 다른 글
Oracle TNS: net 서비스 이름이 잘못 지정되었습니다. (0) | 2023.06.16 |
---|---|
C Int 및 Long 32 - 64비트 단위의 값 범위 (0) | 2023.06.16 |
기본 라인 색상 주기 가져오기 (0) | 2023.06.11 |
새 줄 없이 C를 삽입합니다. (0) | 2023.06.11 |
Python Regex가 그룹을 즉시 대체 (0) | 2023.06.11 |