2009-11-06 3 views
3

우리는 다양한 일들이 진행되는 복잡한 페이지에 대해 다양한 관련 세션 변수가 있습니다. 현재이 세션 값은 개별 페이지 속성 (Guid, String, Integer 등)입니다. 이러한 속성을 가진 직렬화 가능 객체를 세션에 저장 한 경우보다 효율적입니까?asp.net : 개별 세션 변수 대 세션에 저장된 객체

답변

5

문제가 발생하지는 않지만 ViewState에 페이지 별 값을 저장하는 것이 좋습니다.

public static class SessionInfo 
{ 
    private const string AUDITOR_ID_KEY = "AUDITOR_ID_KEY"; 

    private static T GetSessionObject<T>(string key) 
    { 
     object obj = HttpContext.Current.Session[key]; 
     if (obj == null) 
     { 
      return default(T); 
     } 
     return (T)obj; 
    } 

    private static void SetSessionObject<T>(string key, T value) 
    { 
     if (Equals(value, default(T))) 
     { 
      HttpContext.Current.Session.Remove(key); 
     } 
     else 
     { 
      HttpContext.Current.Session[key] = value; 
     } 
    } 

    public static int AuditorId 
    { 
     get { return GetSessionObject<int>(AUDITOR_ID_KEY); } 
     set { SetSessionObject<int>(AUDITOR_ID_KEY, value); } 
    } 
} 
+0

Re : Viewstate, 값은 세션에서 저장됩니다. 사용자가 페이지에서 다른 곳으로 이동해야 할 때입니다 (예 : 다양한 새 항목을 추가하거나 사이트를 탐색 할 때). 세션 변수는 세션에 대해 지속되는 다양한 범주 및 필터 선택 사항을 저장합니다. 이 경우 세션은 쿠키보다 안전하고 안정적입니다. –

+0

@ 마크 - 세션이 더 나은 선택 인 것 같습니다. ViewState가 암호화되어 숨겨진 양식 필드에 저장되었다는 것을 지적하고 싶습니다. 쿠키에 저장되지 않습니다. –

+0

@Jamie -이 솔루션을 공유해 주셔서 감사합니다. 따라서이 경로를 따라 가면서 허용되는 답변이 변경되었습니다. –

3

클래스가 작고 컴팩트하며 기능이 많지 않은 한 문제는 없습니다. 한 번 더 자주 생성 된 값을 변경하지 않으려면이 변경 불가능한 구조를 만들 수 있습니다. 수정시 언제든지 새 구조로 덮어 쓸 수 있습니다.

여기에 몇 가지 코드가 있습니다.

public struct MyStruct 
    { 
     public string MyProp; 
     public MyStruct(string myProp) 
     { 
      this.MyProp = myProp; 
     } 
    } 

    public MyStruct MyStructInSession 
    { 
     get 
     { 
      if (Session["_MyStructInSession"] == null) 
      { 
       Session["_MyStructInSession"] = new MyStruct("unnamed"); 
       //or you can throw an exception but that's not adviseble. 
       //throw new Exception("Nothing stored in session"); 
      } 
      return (MyStruct)Session["_MyStructInSession"]; 
     } 
     set 
     { 
      Session["_MyStructInSession"] = value; 
     } 
    } 
+0

값을 개별적으로 업데이트해야합니다 :

나는 예를 들어, 세션 변수에 대한 액세스를 래핑 SessionInfo라는 정적 클래스를 만들 수 있습니다. 예, public getters와 setter를 가진 간단한 객체가 될 것입니다. –

+0

불변의 struct 타입을 생성하여 세션에 저장하는 것이 좋습니다. 그게 더 좋은 방법입니다. 나는 과거에이 일을 해왔고, 나를 위해 안정적으로 일했습니다. 내 struct 유형에는 약 8 개의 소품이 있습니다. –

+0

@Curious, 당신이 한 일의 샘플 코드를 보여줄 수 있습니까? –

3

성능에 큰 문제가있는 경우 세션 콘텐츠의 직렬화를 최적화하는 것이 좋습니다. 직렬화/역 직렬화는 세션 서버로 확장하거나 SQL Server를 사용하여 세션 상태를 관리 할 때 더 큰 병목 현상이됩니다. MSDN Magazine 가입일

:

세션 상태는 아웃 - 오브 - 프로세스 저장소에 데이터 저장 전에 세션 딕셔너리 그 내용 이진 블롭 변환 맞춤 직렬화 메커니즘을 사용한다. 직렬화 메커니즘은, 문자열, 부울, 날짜 시간, 시간 범위, INT16, INT32, INT64, 바이트, 숯불, 싱글, 더블, 진수, SByte, UINT16, UINT32 포함 .NET Framework를 기본 유형, 직접 지원을하고있다 UInt64, Guid 및 IntPtr 이러한 유형의 은 객체 유형이 BinaryFormatter로 직렬화되는 동안 얼룩에 직접 작성됩니다 ( ). 직렬화 해제는 동일한 규칙을 따릅니다. 세션을 최적화하면 의 직렬화 오버 헤드와 상태 데이터의 역 직렬화를 크게 줄일 수 있습니다.

세션 개체 모델을 디자인 할 때 세션에 개체 유형을 저장하지 마십시오. 대신 세션 사전에 기본 유형을 저장하고 세션 데이터를 기초로 모든 요청에 ​​ 레이어 세션 객체를 다시 작성하십시오. 이렇게하면 이 BinaryFormatter를 사용하는 오버 헤드를 피할 수 있습니다.

언제나 최적화를 수행하기 전에 성능을 측정하십시오.

+0

안녕하세요, 가능하고 유선형/유지 보수가 가능하도록 유선 상태로 유지하는 일반적인 예방 조치입니다. –

+0

다음 구조체와 함께 갈 것입니다. 그러나 세션 직렬화가 병목 현상이되기 시작하면 항상 구조체를 분리 할 수 ​​있습니다. –