2012-12-21 1 views
2

우리는 ASP.NET viewstate를 사용하여 자체 객체 (예 : 원시 유형)를 저장합니다. 우리가 빌드를 할 때마다 빌드 번호가 증가합니다. 우리가 주변에 일을하려고하는 문제는 서버 업데이트 중입니다 :ViewState 및 직렬화 된 객체 버전 관리

  1. 사용자는
  2. 우리는
  3. 사용자가 동일한 페이지에 다시 게시 원인이되는 웹 응용 프로그램의 새 빌드를 배포 페이지를로드하고, 예외가 throw됩니다.

    • HttpException :이 페이지에 대한 상태 정보가 유효하지 않아 손상되었을 수 있습니다.
    • ViewStateException : 잘못된 viewstate입니다.
    • ArgumentException : 직렬화 된 데이터가 유효하지 않습니다.
    • FileLoadException : 파일 또는 어셈블리 '[our assembly], 버전 = [새 버전], Culture = neutral, PublicKeyToken = ...'또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾아낸 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다

이 일어나는 이유를 이해 - viewstate가이 클래스의 이전 버전에 연재 한 후, 새 버전으로 직렬화하려고하는데 .NET 직렬화는이를 지원하지 않습니다.

데이터 멤버가 빌드간에 거의 항상 호환되므로 사용자 정의 PageStatePersister를 만들고 JSON을 사용하여 (그리고 암호화 한 다음) serialize/deserialize를 고려했습니다.

다른 아이디어?

답변

1

먼저 viewstate에서 데이터를 직렬화하는 것은 좋지 않습니다. 한 가지 이유는이 비 직렬화가 서버의 누락을 충족시키지 못하도록하는 것이지만 다른 문제는 데이터가 서버로 이동하고 모든 다시 게시로 돌아가는 것입니다.

예를 들어 캐시 또는 세션에 해당 데이터를 저장하는 간단한 저장소 접근 방식을 사용하여 어디에서 어떻게 유지되는지에 관계없이 저장소에 요청할 수 있습니다. 이는 메모리 상주 저장소를 모방하는 데 사용됩니다. 그래서 "MyDataSotarage.GetMyCustomObject()"및 "MyDataSotarage.SaveMyCustomObject (CustomObject obj)"와 같은 것이 있으므로 리포지토리에 항목을 캐시에 추가하는 로직이 있습니다 (예 : 사용자 ID와 객체 이름을 키로 사용) 또는 세션 당신이 원한다면 (그들에게 경의를 표하지 말라, 어떤 사람들은 그렇다). 구현 방식보다 디자인 방식에 가깝지만 데이터가 저장되는 방식을 완벽하게 분리하여 직렬화 문제를 피할 수 있으며 네트워크 트래픽 등 KB를 절약 할 수 있습니다.

+0

David, 하지만 우리는 서버 팜을 가지고 있으므로 공유 세션 데이터베이스 나 (memcached와 같은) 분산 메모리 캐시를 설정하지 않는 한 세션이나 캐시에 저장하는 것은 옵션이 아닙니다.이 시점에서 우리는 실제로하고 싶지 않습니다. – joelsand