문제

stackoverflow의 첫 번째 게시물, 훌륭한 피드백을 받기를 바랍니다 :)

저는 현재 웹 사이트의 균형을로드하려고합니다. IIS 6과 함께 Windows Server 2003에서 2 개의 클러스터 NLB를 설정했습니다.

설정을 테스트하는 동안 때때로 세션이 손실된다는 것을 알았습니다. 하루 반 후에 결과는 다음과 같습니다.

  1. 예, Machine.config 모두 동일한 암호화/암호 해독 키를 가지고 있습니다.
  2. 예, IIS metabase.xml의 ID는 두 컴퓨터 모두 동일합니다. 실제로 "관리자"를 제외하고 전체 파일은 동일합니다.
  3. 두 웹 응용 프로그램 모두 "StatesErver"로 설정되고 동일한 시스템을 가리키는 것입니다.

이 시점부터 Google을 검색하면 정보와 가능한 솔루션이 적습니다.

내가 아는 바에 따르면이 문제를 일으키는 특별한 패턴은 없습니다. 그것은 가끔씩 발생합니다.

문제를 찾으려고 노력하는 동안 요청이 ASP 세션 ID 쿠키를 서버로 전송했지만 서버는 사용자 세션에 매핑되지 않았습니다.

따라서 요청 번호 X는 클라이언트에서 전송되었으며 쿠키와 함께 세션이 매핑되었으며 모든 것이 순조롭게 진행되었습니다. 요청 번호 x+1은 쿠키와 함께 클라이언트에서 전송되었지만 세션은 찾을 수 없었습니다.

두 요청은 NLB의 동일한 기계에서 이루어졌습니다.

다음은 ASP Trace.AXD의 스 니펫입니다.

첫 번째 요청 :

세부 사항 요청 세션 ID : J2FFVY45UPDPC52UHW1MBG55 요청 유형 : 요청 시간 가져 오기 : 11/26/2008 2:58:06 PM 상태 코드 : 200 요청 인코딩 : 유니 코드 (UTF-8) 응답 인코딩 : 유니 코드 (UTF-8)

쿠키 컬렉션을 요청하십시오

이름 값 크기

asp.net_sessionid j2ffvy45updpc52uhw1mbg55 42 AID 22 9

응답 쿠키 수집

이름 값 크기

헤더 컬렉션

이름 가치

쿠키 asp.net_sessionId = j2ffvy45updpc52uhw1mbg55; 원조 = 22

두 번째 요청 :

요청 세션 ID : 요청 유형 : 요청 후 시간 : 11/26/2008 2:58:08 PM 상태 코드 :
인코딩 요청 : 유니 코드 (UTF-8) 응답 인코딩 :

쿠키 컬렉션을 요청하십시오

이름 값 크기

응답 쿠키 수집

이름 값 크기

헤더 컬렉션 이름 값 쿠키 ASP.NET_SESSITEID = J2FFVY45UPDPC52UHW1MBG55; 원조 = 22

두 번째 요청에서 볼 수 있듯이 쿠키는 클라이언트에서 전송되지만 ASP는 쿠키를 "요청 쿠키 수집"에 추가하지 않는 것 같습니다. 그게 세션을 찾지 못하는 이유라고 생각합니다.

그렇다면 왜 쿠키가 세션에 매핑되지 않습니까? 그게 문제인가요? 다른 곳에서 문제가 있습니까?

설명을 자유롭게 요청하십시오.

귀하의 의견에 감사드립니다.

JF

도움이 되었습니까?

해결책

마침내 내 문제에 대한 답을 찾았습니다. 원산지는 응용 프로그램 코드 내에 있습니다 (프로그래머의 제 3 자 도구 '버그'의 99%). 누군가가 비슷한 시나리오에있는 경우 어쨌든 게시하기로 결정했습니다.

이 코드는 WebServiceRequester 클래스의 일부였습니다. 웹 서비스 요청자 클래스는 세션이 만들어 졌을 때 시동되었으며 세션에 저장되었습니다. 창조 중에, 우리는 멤버 'm_webserviceurl'을 초기화 하고이 멤버는 세션에 저장됩니다. 이 값은이 멤버 초기화가 로컬 컴퓨터의 설정에 따라 다릅니다.

중요한 부분은 다음과 같습니다. WebServicerequester 클래스에는 웹 서비스 객체가 포함되어 있습니다. 웹 서비스 객체는 세션에서 저장할 수 없으며 ASP에서는 직렬화 할 수 없습니다. 속성은 [비 서리 화] 속성을 가지고있었습니다. 따라서 페이지 수명주기 동안 첫 번째 객체의 '웹 서비스'속성에 액세스 할 때마다 새 제품을 만들고 세션에 저장된 URL 'M_WEBSERVICEURL'을 할당해야했습니다. 따라서 새로운 WebService Object는 아마도 다른 컴퓨터에서 각 컴퓨터의 다른 설정을 의미 할 수 있습니다.

그래서 여기에 무슨 일이 있었는지 : Box 29는 LocalHost에서 웹 서비스에 액세스하도록 설정되었습니다.

Box 30은 웹 서비스에 192.168.253.29로 액세스하도록 설정되었습니다.

기술적으로, 그들은 둘 다 같은 기계에 설정되어 있습니다. 그러나 다음은 시나리오입니다.

Box 29에 로그인하십시오.

여기에 상자 29에 대한 일부 요청

NLB 밸런싱 박스 30에 우리를 가져옵니다. Box 30로드 세션, 웹 서비스 주소로 LocalHost를 사용하여 새로운 웹 서비스를 작성하십시오. Box 30은 잘못된 웹 서비스에 요청하여 세션 만료 된 예외로 이어졌습니다.

디버그 중 문제 중 하나는 로컬 커뮤니케이션이 네트워크 모니터와 함께 기록되지 않았다는 것입니다.

흔적으로 나를 인도하는 것은 우리가 상자 29 로그 트레이스에 예외를 기록한 적이 없다는 것입니다.

모두에게 제안해 주셔서 감사합니다. 정말 감사했습니다.

좋은 하루 보내세요. JF

다른 팁

질문에 대한 답이 아니지만 SQL Server 기반 세션 스토어를 사용하여 시도해 보셨습니까? (ASP.NET과 함께 제공되는 임시 스크립트 대신 영구 스크립트에 대한 MSDN에서 검색)

실행 파일 세션 서비스에 대해 "나쁜 것"을 들었고 결과적으로 사용하지 않았습니다. SQL Server 기반 솔루션으로 웹 농업 문제는 없었습니다.

죄송합니다. 문제에 대한 답이 아니었지만 (a) 고치거나 (b) 크게 좁혀야합니다.

글쎄, Visual Studio를 사용하는 경우 MSDE (Visual Studio와 함께 제공되는 SQL Server의 컷 다운 버전)로 테스트 할 수 있습니다.

상태 서버 문제를 배제하는 데 도움이 될 수 있습니다 ...

데이터베이스 접근 방식을 사용하려면 고유 한 문제가 있습니다. 선호하는 접근 방식을 사용할 수 있어야한다고 생각합니다.

아마도 이 세션 문제 해결 기사 도움이 될 것이다?

또는 "ASP.NET의 세션 관련 문제 문제 해결"

또는 "만료 된 ASP.NET 세션 상태 및 옵션 문제 해결"

나는 절름발이가되고 MS SQL Server의 제안을 다시 강요 할 것입니다. 상업용 용도를 포함하여 완전한 무료 인 SQL Server Express를 설치 하며이 단계에서는 문제가되지 않는 3 가지 단점 만 있습니다.

  • 최대 4GB 크기 데이터베이스
  • 최대 1 CPU 코어 사용
  • 최대 1GB RAM 사용

고려해야 할 몇 가지 사항 :

  • 웹 사이트의로드는 무엇입니까? State Server는 많은 동시 적중에 직면 할 때 충돌하는 경향이 있습니다. 우리는 실제로 소수의 사용자가있는 시나리오에서만 사용하고 있습니다 (10, 주로 백엔드 시스템). 매일 1000 대의 사용자에게 서비스를 제공하는 사이트의 프로덕션에서이를 사용하려고 할 때마다 충돌하여 세션 데이터 손실로 이어질 것입니다.
  • 우리가 관리하는 생산 환경 중 하나에서 MSSQL 2005 Express를 사용하여 세션을 관리하고 있으며,이 사이트에는 하루에 10k+ 사용자와 하루에 200k+ 페이지가 있습니다. 이것은 세션이 필수품이며 응용 프로그램에 밀접하게 결합 된 경우 권장되는 접근법입니다.

MSSQL Express를 State DB로 사용하려는 경우 SQL Server 에이전트와 함께 제공되지 않으면 백그라운드에서 실행중인 작업 스케줄러가없고 만료 된 세션을 청소하지 않음을 기억하십시오. 스케줄러를 찾고 정기적으로 저장된 세션을 실행하는 것이 좋습니다.

행운을 빕니다

SQL을 엉망으로 만드는 대신 테스트를 IIS 노드 중 하나로 직접 보내서 동일한 문제가 있는지 확인하십시오. 소수의 테스트 스테이트 서버를 수행하는 것이 문제가되지 않는다고 확신합니다.

코드를 통해 asp.net_sessionid의 도메인 이름을 ".yourdomain.com"으로 설정하십시오. 기본적으로 asp.net_sessionid 쿠키 도메인 이름은 전체 응용 프로그램 경로로 설정됩니다. 따라서 이것이 쿠키가 여행하지 않는 이유 중 하나 일 수 있습니다.

예 : request.cookies [ "asp.net_sessionid"]. domain = ".yourdomain.com". 첫 번째 ""를 기억하십시오. " 도메인 이름에서 중요합니다.

AcquireRequestState 이벤트의 HTTPModule 에서이 작업을 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top