2011-11-07 1 views
25

IRequiresSessionStateIReadOnlySessionState의 차이점은 두 번째 세션 변수가 변경 사항을 세션 변수에 저장할 수 없다는 것입니까?IRequiresSessionState와 IReadOnlySessionState

두 가지 모두 내 HttpHandler에서 세션 변수에 액세스 할 수있는 기능을 제공합니다. 그런데 왜 내가 IReadOnlySessionState을 선호 할까? 단지 다음 요청에 대한 세션 저장을 제한합니다.
또는 IRequiresSessionState 이상의 성능 이점을 제공합니까?

IRequiresSessionState보다 IReadOnlySessionState을 더 선호하는 경우는 언제입니까?

답변

24

중요한 차이점은 IRequiresSessionState가 현재 세션에 배타적 잠금을 설정하여 잠재적으로 현재 사용자의 동시 요청 수를 제한한다는 것입니다. 이 잠금 현상에 대한 자세한 내용은 Is it possible to force request concurrency when using ASP.NET sessions?을 참조하십시오.

반면 IReadOnlySessionState는 배타적 잠금을 획득하지 않습니다.

이 내용은 renad's helpful answer to an almost identical SO question과 동일합니다.

내가 이것을 위해 찾은 최고의 공식 문서는 MSDN 문서 Session State Providers에서이다 : 세션 상태 공급자에있는 가장 중요한 방법 중

이를 GetItem, GetItemExclusive 및 SetAndReleaseItemExclusive 있습니다. 처음 두 개는 SessionStateModule에 의해 호출되어 데이터 소스에서 세션을 검색합니다. 요청 된 페이지가 IRequiresSessionState 인터페이스 (기본적으로 IRequiresSessionState를 구현하는 모든 페이지)를 구현하는 경우 SessionStateModule의 AcquireRequestState 이벤트 핸들러는 세션 상태 공급자의 GetItemExclusive 메서드를 호출합니다. 메서드 이름에서 "Exclusive"라는 단어는 다른 요청에 의해 현재 사용되지 않는 경우에만 세션을 검색해야 함을 의미합니다. 반면에 요청 된 페이지가 IReadOnlySessionState 인터페이스를 구현하면 (이를 달성하는 가장 일반적인 방법은 페이지의 @ Page 지시문에 EnableSessionState = "ReadOnly"특성을 포함시키는 것입니다) SessionStateModule은 공급자의 GetItem 메서드를 호출합니다. SessionStateModule에 의해 겹쳐지는 읽기 액세스가 허용되므로 독점 성은 필요하지 않습니다.

참고 명시 적으로 이러한 인터페이스를 사용하고 EnableSessionState Page 지시문 사용 사이의 병렬 :

  • EnableSessionState = 거짓 < -> 아니요 내가 * sessionState의 인터페이스
  • EnableSessionState = 진정한 < -> IRequiresSessionState 인터페이스
  • EnableSessionState = 읽기 전용 < -> IReadOnlySessionState
+2

+1 잠금 ** - 웹 응용 프로그램이 세션 상태를 사용하는 동시에 비동기 요청을 처리 할 수있는 경우 매우 중요합니다. –

1

IReadOnlySessionState을 구현, 당신은 세션에 대한 읽기 전용 액세스해야하는 경우

을 제기 우리의 HttpHandler 및 클래스에서 세션에 액세스이 인터페이스를 사용하여이 http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

IRequiresSessionState이 System.Web.SessionState 에서 파생 따라 인터페이스.

+0

네,'IRequiresSessionState'가 무엇을 사용하는지 알지만 왜'IReadOnlySessionState'가 존재합니까? 왜 나는 그것을 선호 하는가? –

+0

PostMapRequestHandler에서 HttpModule은 실제 처리기에서 IRequiresSessionState 또는 IReadOnlySessionState를 구현하는 사용자 지정 처리기로 바뀌어 seesion을 사용할 수 있습니다. PreRequestHandlerExecute에서 세션에 액세스하고 필요한 경우 리디렉션 할 수 있습니다. PostAcquireRequestState에서 원본 처리기로 다시 바꿉니다. – coder

6

해당 인터페이스는 프레임 워크가 요청의 끝에서 현재 세션 상태를 저장할 것인지 여부를 제어합니다. out-of-process 세션 상태 저장소를 사용할 때 더 큰 차이를 만듭니다. 이 경우 인터페이스가 없어도 시스템은 변경되지 않은 경우에도 세션 데이터를 원격 데이터베이스에 저장합니다 (시스템은 요청 중에 세션 데이터가 수정되었는지 추적하지 않습니다). IReadOnlySessionState 인터페이스를 사용하면 후기 입 단계를 건너 뜁니다.

+2

어디서 정보를 얻었습니까? 링크를 참조 할 수 있습니까? –