asp.net 부하 균형 시 Session 공유 문 제 를 어떻게 해결 합 니까?

모든 클 라 이언 트 가 사 이 트 를 방문 할 때 해당 하 는 Session 을 만들어 고객 의 상태 정 보 를 저장 합 니 다.사이트 가 부하 균형 을 이 루 면 session 공 유 는 해 야 합 니 다.IIS 는 session 에 대한 저장 은 다섯 가지 모델 이 있 습 니 다.
1.ASP.Net session 저장 방식
1.InProc 모드(프로 세 스 내 모드).기본 값 으로 설정 합 니 다.
세 션 상 태 는 웹 서버 의 메모리 에 저 장 됩 니 다.
2.StateServer 모드(상태 서버 모드).
세 션 상 태 는 ASP.Net 상태 서비스 라 는 단독 프로 세 스에 저 장 됩 니 다.웹 프로그램 을 다시 시작 할 때 세 션 상 태 를 유지 하고 세 션 상 태 를 네트워크 에 있 는 여러 웹 서버 에 사용 할 수 있 도록 합 니 다.
3.SQL Server 모드.
세 션 상태 가 SQL Server 데이터베이스 에 저 장 됩 니 다.웹 프로그램 을 다시 시작 할 때 세 션 상 태 를 유지 하고 세 션 상 태 를 네트워크 에 있 는 여러 웹 서버 에 사용 할 수 있 도록 합 니 다.
4.사용자 지정 모드
이 모드 는 사용자 정의 저장 소 공급 자 를 지정 할 수 있 습 니 다.
5、끄 기 모드
이 모드 에 서 는 세 션 상 태 를 금지 합 니 다.
2.StateServer 를 사용 하여 session 을 저장 합 니 다.
사이트 가 부하 균형 을 이 루 면 session 저장 소 에 대해 2,3,4 만 선택 할 수 있 습 니 다.다음은 StateServer 모드 를 소개 하 겠 습 니 다.먼저 상태 서 비 스 를 시작 해 야 합 니 다.

그리고 웹 사이트 의'세 션 상태'를 설정 합 니 다.

이 컴퓨터 의 상태 서비스 사용 하기

웹.config 에서 설정 파일 을 자동 으로 생 성 합 니 다.(수 동 으로 추가 할 수 없다 면)

<sessionStatemode=”StateServer”stateConnectionString=”tcpip=loopback:42424″timeout=”20″/>
그러나 여기 에는 문제 가 하나 있 습 니 다.만약 에 모든 서버 가 위 에 설정 되 어 있 으 면 각 서버 의 Session 은 본 컴퓨터 의 StateServer 에 저장 되 어 있 고 공 유 를 시작 하 는 역할 을 하지 않 습 니 다.여 기 는 StateServer 한 대 를 공유 하여 다른 서버 에 접근 하 게 하고 Session 을 위 에 저장 해 야 합 니 다.regedit 를 실행→레 지 스 트 를 엽 니 다→HKEY 를 찾 아야 합 니 다.LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 노드→AllowRemoteConnection 의 키 값 을"1"로 설정 합 니 다(1 은 원 격 컴퓨터 의 연결 을 허용 하기 위해 0 은 금지 입 니 다)

StateServer 포트 도 수정 할 수 있 습 니 다.

다음은 다른 서버 의 웹.config 설정 파일 을 수정 합 니 다.(session State 는 원 격 접근 을 허용 하 는 StateServer 를 가리 키 고 있 습 니 다)

<sessionStatemode=”StateServer”stateConnectionString=”tcpip=10.16.5.30:22222″timeout=”20″/>
StateServer 와 같은 공유 식 session 저장 방식 은 안전 위험 이 있 을 뿐만 아니 라 위 에 공 유 된 StateServer 와 같이 서버 를 다시 시작 하면 모든 session 을 잃 어 버 리 기 때문에 이러한 session 저장 방식 은 완벽 하지 않 습 니 다.StateServer 로 session 을 저장 하 는 것 은 단일 컴퓨터 IIS 로 다 중 프로 세 스 를 시작 하 는 데 적합 합 니 다.

3.SQL server 를 사용 하여 session 을 저장 합 니 다.
보안 을 확보 하고 서버 재 부팅 으로 인해 session 을 잃 어 버 리 지 않도록 sql server 로 session 을 저장 해 야 합 니 다.ASP.NET 2.0 버 전 후 마이크로소프트 는 aspnet 을 제공 합 니 다.regsql.exe 도 구 는 Session 데이터 베 이 스 를 편리 하 게 설정 할 수 있 습 니 다.이 도 구 는 웹 서버 의 시스템 루트 디 렉 터 리 Microsoft.NETFramework 버 전 번호 폴 더 에 있 습 니 다.
cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
aspnet_regsql.exe -ssadd -sstype c -d -S -U -P
aspnet_regsql.exe -ssadd -sstype c -d ASPState -S 10.16.5.36 -U sa -P HAha789
주:은 데이터베이스 이름 이 ASPState 이 고,는 데이터베이스 인 스 턴 스 이름 입 니 다.IBM-PC\\SQLEXPRESS(데이터베이스 가 2005 가 아니라면 ip 주 소 를 쓰 지 마 십시오.그렇지 않 으 면 연결 에 실패 합 니 다),은 sa(또는 sa 와 같은 권한),는 sa 사용자 이름 의 암호 세 션 정의 에 성 공 했 으 나 웹 응용 프로그램 에서 해당 하 는 설정 을 제시 합 니 다.이 때 SQLServer 를 보면 데이터베이스 ASPState 가 추 가 됐 지만 표 가 없습니다.
명령 행 에서 다음 명령 을 실행 합 니 다:aspnetregsql.exe -ssadd -sstype p -S -U -P
aspnet_regsql.exe-ssadd-sstypep-S10.16.5.36-Usa-PHAha789

이 명령 은 이 응용 프로그램 에 대해 지구 화 작업 을 진행 했다.이 때 ASPState 데이터베이스 에 표 가 두 장 더 있 는 것 을 볼 수 있 습 니 다.ASPState TempSession 은 Session 을 저장 할 수 있 습 니 다.다음은 웹 사이트 의'세 션 상태'를 설정 해 야 합 니 다.

ASPStateTempSessions 표 의 SessionID 는 두 부분 을 포함한다.사이트 에서 생 성 된 24 비트 SessionID 와 8 비트 AppId 로 구성 되 어 있 으 며,서로 다른 사이트 에 대해 서 는 AppId 와 AppName 도 다 르 기 때문에 서로 다른 사이트 에서 Session 을 공유 할 수 있 으 면 이 32 비트 의 SessionID 가 일치 하도록 보장 해 야 하기 때문에 저장 과정 을 수정 하여 TempGetAppID 를 얻 을 수 있 는 SessionID 는 AppName 과 무관 하 다.TempGetAppID 수정 은 다음 과 같 습 니 다.

웹.config 수정(데이터베이스 에서 ASPState 에 계 정 을 따로 할당 합 니 다)

<sessionStatemode="SQLServer"sqlConnectionString="datasource=10.16.5.36;userid=sa;password=HAha789"cookieless="false"timeout="20"></sessionState>
이렇게 하면 sql server 가 session 에 대한 저장 을 실현 할 수 있 습 니 다.물론 memcache 로 session 을 저장 할 수도 있 습 니 다.
4.ASP.NET 오류,보기 상태 MAC 검증 실패
그러나 사이트 로그 인 방문 시"ASP.NET 오류,보기 상태 MAC 검증 실패"를 잘못 보 고 했 습 니 다.baidu 는 페이지 나 웹.config 에 EnableEventValidation="false"EnableViewState Mac="false"ViewState Encryption Mode="Never"속성 설정 이 라 고 말 합 니 다.그러나 이 는 근본적으로 문 제 를 해결 하 는 것 이 아니 라 오히려 안전 하지 않다.잘못 됐다 고 안 해도 돼 요?실 수 는 문 제 를 해결 해 야 하고,근본적으로 문 제 를 해결 해 야 한다.
오류 원인 분석:
ASP.NET 에는 암호 화 와 관련 된 것 이 많 습 니 다.예 를 들 어 ViewState,예 를 들 어 Forms AuthenticationTicket 등 은 모두 클 라 이언 트 에 전송 되 어야 암호 화 되 어야 안전성 을 보장 할 수 있 습 니 다.암호 화 하려 면 비밀 키 가 있어 야 합 니 다.그러나 이 비밀 키 는 지정 되 지 않 았 습 니 다.그것 은 ASP.NET 에서 자동 으로 생 성 되 었 기 때 문 입 니 다.그러나 네트워크 장 이나 그룹 에 집중 되 거나 CDN 로 딩 을 한 가상 호스트 에서 여러 대의 서버 ASP.NET 과 관련 되 어 있 기 때문에 각 기기 에 똑 같은 비밀 키 를 자동 으로 생 성 할 수 없 기 때문에 이 서버 에서 발생 하 는 데 이 터 를 분석 할 수 없습니다.그래서 틀 렸 어 요.어 떡 하지?ASP.NET 은 여러 서버 에서 같은 비밀 키 를 자동 으로 무 작위 로 만 들 수 없 으 니 우리 만 지정 합 니 다.
MachineKey 생 성 도구,코드 자동 생 성
https://www.fishlee.net/tools/machinekeygenerator
웹 config 에 생 성 된 Machinekey 를 삽입 합 니 다:

<view class="list" wx:for="{{list}}" wx:key>
 <view class="item">
  <view class="wrap">{{item}}</view>
  <view class="delete"><text>  </text></view>
 </view>
</view>
MachineKey 의 역할:
ASP.net 에서 forms authentication 을 사용 할 때 쿠키 데이터 의 암호 화 와 복호화.이 부분의 데이터 가 viewtate 데이터 의 암호 화 와 복호화 되 지 않도록 합 니 다.이 부분의 데이터 가 변경 되 지 않도록 확보 하 다.프로 세 스 외 session(out-of-process session)을 사용 할 때 세 션 상태 표 지 를 검증 합 니 다.Session StateMode 의 SQLServer 를 이용 하여 session 공 유 를 실현 합 니 다.마이크로소프트 의 것 이기 때문에 일정한 제한 줄 이 있 고 sql server 일 수 밖 에 없습니다.사실 session 공 유 는 다른 데이터 베 이 스 를 사용 할 수 있 습 니 다.예 를 들 어 memcache,redis 등 입 니 다.
5.ASP.NET 상태 데이터베이스 FAQ
1.만약 에 SESSION 값 을 데이터베이스 에 저장 하고 사용자 가 프로그램 을 닫 으 면 데이터베이스 에 있 는 SESSION 값 을 어떻게 비 웁 니까?
실제 ASP.NET 은 상태 데이터 베 이 스 를 만 들 때 SQL Server 에이전트(SQL Server Agent)작업 에 작업 을 추가 합 니 다.이름 은<상태 데이터베이스 이름> 입 니 다.Job_DeleteExpiredSessions。SQL Server 프 록 시 데이터 베 이 스 를 열 면 추 가 된 상태 기록 의 시간 초과 필드(Exprires)를 통 해 시간 초과 상태 데 이 터 를 정기 적 으로 삭제 할 수 있 습 니 다.

2.ASPStateTempSessions 표 의 SessionId 필드 는 어떻게 사용 합 니까?
데이터베이스 에 있 는 이 표 의 SessionID 필드 의 값 은 SessionID 와 AppID 로 구성 되 어 있 으 며 마지막 8 자 리 는 AppID 이기 때문에 8 자 리 는 반드시 SessionID 입 니 다.예 를 들 어 데이터베이스 에 저 장 된 값 은"ekr30c3mwvnc 3145 yrswew3a 037 e5e5a"이 고,후 8 비트 의"037 e5e5a"는 AppID 이 며,앞의"ekr30c3mwvnc 3145 yrswew3a"는 응용 프로그램 에서 Session.essionID 로 얻 은 문자열 을 사용 할 수 있 습 니 다.

3、세 션 이 언제 업데이트 되 었 는 지 어떻게 판단 하나 요?
세 션 기록 이 업 데 이 트 될 때 Expires 와 LockDateLocal 을 동시에 업데이트 합 니 다.Expires 필드 는 UTC 시간 입 니 다.로 컬 간 비교 판단 을 하려 면 LockDateLocal 을 사용 해 야 합 니 다.
4.웹.config 설정 파일 노드 정 보 를 얻 는 프로그램?
'웹.config 파일 설정 인 스 턴 스 가 져 오기

Dim configuration As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config")
'상태 설정 노드 인 스 턴 스 획득

Dim mSessionStateSection As System.Web.Configuration.SessionStateSection = CType(configuration.GetSection("system.web/sessionState"),System.Web.Configuration.SessionStateSection)
'상태 모드 획득'

Response.Write(mSessionStateSection.Mode)
'획득 상태 시간 초과'.

Response.Write(mSessionStateSection.Timeout)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기