2009-11-19 6 views
1

내 asp.net 응용 프로그램은 부하 분산 시스템에 배포됩니다. 그리고 나는 전체 세션에서 사용자의 역할 (문자열)을 유지하기 만하면됩니다. asp.net의 세션 정보가 데이터베이스에 저장되므로 asp.net 엔진에 액세스하여 DB ecah 시간에 사용자가 페이지간에 전환하고 싶지 않다고 들었습니다. 사용자의 역할을 확인해야 할 때마다 내 DB에서 역할을 얻고 싶지도 않습니다. 숨겨진 필드에 역할 정보를 저장하는 것이 하나의 방법이라는 것을 알고 있습니다. 상수 세션 값을 저장하는 효율적인 방법은 무엇입니까?세션 변수를 저장하는 효율적인 방법은 무엇입니까

답변

1

세션에는 세 가지 모드가 있습니다. 모드 설정은 inproc, sqlserver 및 stateserver의 세 가지 옵션을 지원합니다. 당신은로드 밸런스가 필요하고, inproc은 자동으로 종료됩니다. sqlserver 또는 stateserver를 사용하도록 구성 할 수 있습니다.

0

쿠키를 사용할 수도 있습니다. 세션 데이터는 기본적으로 메모리에 저장되므로 팜의 모든 서버에서 세션 데이터를 사용하려면 데이터베이스에 저장되도록 구성해야합니다. 메모리에 저장할 수 있다면, 당신은 부하 분산 처리하기 위해이 방법을 사용할 수 있습니다 :이 한 번만 서버 당 데이터베이스에 여행가 발생합니다

if (Session["Role"] == null) 
    Session["Role"] = GetUserRole(); 

.

세션 상태 here에 대해 자세히 알아보십시오.

+1

SQL 모드에서는 각 요청에 대해 전체 세션 사전을 DB에서 읽고 데이터베이스에 한 번 씁니다. 따라서 여러 서버간에 동기화를 유지하는 것이 쉬워 지지만 추가 DB 읽기 및 쓰기 비용은 발생합니다. – RickNZ

0

"역할"은 권한과 관련이있는 경우 비공개 필드 또는 asp와 관련하여 viewstate와 같이 클라이언트 측에서 편집 할 수있는 다른 방법으로 저장하는 것은 좋지 않습니다. .그물.

나는 특히 세션을 크게 열심히하며, 성능 향상을 위해 사용하고 있습니다. 당신이 정말로 원하는 것은 캐싱과 당신이 조사 할 수있는 훌륭한 솔루션이 많이 있습니다. 바로 asp.net에 내장 된 Cache 데이터 사전을 활용할 수 있으며 페이지 클래스에서 멤버로 표시됩니다. 캐시는 본질적으로 사용자가 입력 한 내용을 직렬화하여 메모리에 저장합니다. 캐시 오브젝트를 사용하면 단일 서버 설정으로 가장 잘 작동합니다. 로드 밸런싱을 사용하고 있으므로 Memcached 또는 AppFabric Caching (이전의 코드 명 세기)과 같은 배포 캐시 시스템을 활용하고 싶을 것입니다. Memched는 AppFabric이 새로운 Microsoft 제품이되었지만 이제는 사용할 수있게되었지만 Asp.Net과 같은 다른 Microsoft 기술과의 통합 및 지원이 잘되어야하는 많은 큰 사이트에서 사용됩니다.

분산 된 캐싱을 사용하면 데이터베이스로 돌아 가지 않아도되며 캐시로 이동하는 것이 본질적으로 다릅니다. 이것이 처음에 더 효율적 인 이유는 데이터베이스가 모든 것을 저장해야하는 곳에서 최근에 액세스 한 항목을 효율적으로 저장하는 것에 대해서만 캐시가 걱정해야한다는 것입니다.

로드 균형 조정기에서 서버 선호도를 사용하는 경우 배포 캐싱 경로를 피할 수 있음을 지적하고자합니다. 엄밀히 말하면 서버 친 화성을 사용하지 않고도 사용할 수 있지만 캐시 미스는 더 많이 발생합니다.

1

DB 액세스를 피하려면 쿠키를 사용하여 세션 상태 대신 사용자 역할을 저장하십시오. 보안상의 이유로 (아마도 키의 일부로 세션 ID를 사용하여) 쿠키를 암호화/인코딩 할 수 있습니다. 쿠키는 브라우저가 요청할 때마다 서버로 전송되기 때문에로드 균형 조정 시나리오에서 정상적으로 작동합니다. 브라우저에 첨부 된 URL을 제한하려면 쿠키 (및 가능하면 HttpOnly)에 경로 속성을 설정하십시오.

기본 제공 ASP.NET 멤버 자격 공급자를 사용하는 경우 역할 멤버 자격 및 관련 세부 정보는 공급자가 자동으로 처리합니다.

관련 문제