IE에서 탐색 중인 현재 페이지의 HTML 소스 코드를 보는 습관이 있는 경우 다음과 유사한 코드 조각을 자주 볼 수 있습니다.
(이 데이터는 직렬화된 Base64 인코딩 문자열 값이며 Page.SavePageStateToPersistenceMedium 메서드에 의해 출력되기 전에 저장되고 Page.LoadPageStateFromPersistenceMedium에 의해 로드됩니다.) 하지만 우리는 세 가지 수준
을
통해 이러한 데이터의 왕복을 쉽게 비활성화할 수 있습니다.
machine.config의
애플리케이션 수준에서 Web Applicin의 web.config에
단일 페이지 수준에서 페이지에 < %@Page 활성화ViewStateMac='false' %>를 설정하거나 코드를 통해 Page.EnableViewStateMac = false를 설정합니다.
하지만 부작용을 일으키지 않고 ViewState를 비활성화하여 데이터 전송 부담을 완전히 해결할 수 있다면 MS 아키텍트는 그렇게 귀여울 정도로 멍청하지 않을 것입니다(없어도 되는 것으로 놔둬야 무슨 소용이 있겠습니까?). 단순히 비활성화하는 것만으로는 이 전송 부담 문제를 해결할 수 없으며 네트워크 왕복의 전송량을 가능한 한 작게 만드는 다른 경로를 찾을 수 있으므로 압축이 첫 번째 선택이 되었습니다. Page 클래스의 SavePageStateToPersistenceMedium() 메서드와 LoadPageStateFromPersistenceMedium() 메서드를 오버로드하고 오버로드된 메서드의 데이터를 압축 및 압축 해제하기만 하면 됩니다. 오픈 소스 프로젝트 SharpZipLib에서 제공하는 GZipInputStream 및 GZipOutputStream 클래스가 우리의 관점에 포함되었습니다. 편의를 위해 다음 코드를
사용하여 CompressionHelper 클래스를 작성할 수도 있습니다.
2ICSharpCode.SharpZipLib.GZip 사용;
3
4네임스페이스 Ycweb.Components
5{
6 /**//// <요약>
7 /// CompressionHelper에 대한 요약 설명입니다.
8 ///
9 공개 클래스 CompressionHelper
10 {
11 공개CompressionHelper()
12 {
13 //
14 // TODO: 여기에 생성자 논리를 추가합니다.
15 //
16}
17
18 /**//// <요약>
19 /// 데이터 압축
20 ///
21 /// 압축할 바이트 배열
22 ///
23 공개 정적 바이트[] CompressByte(바이트[] 데이터)
스물넷 {
25 MemoryStream ms = 새로운 MemoryStream();
26 스트림 s=new GZipOutputStream(ms);
27 초.쓰기(데이터, 0, 데이터.길이);
28초.닫기();
29 return ms.ToArray();
30}
31
32 /**//// <요약>
33 /// 데이터 압축 해제
34 ///
35 /// 압축해제할 바이트 배열
36 ///
37 공개 정적 바이트[] DeCompressByte(바이트[] 데이터)
38 {
39 바이트[] writeData = 새 바이트[2048];
40 MemoryStream ms= 새로운 MemoryStream( 데이터 );
41 스트림 sm = 스트림으로서의 새로운 GZipInputStream(ms);
42 메모리스트림 outStream = new MemoryStream();
43 동안 (사실)
44 {
45 int size = sm.Read(writeData,0, writeData.Length );
46 if (크기 >0)
47 {
48 outStream.Write(writeData,0,size);
49 }
그 외 50개
51 {
52 휴식;
53}
54 }
55 sm.닫기();
56바이트[] outArr = outStream.ToArray();
57 아웃스트림.닫기();
58 반환 도착Arr;
59 }
60 }
61} 그런 다음 Page 클래스에서 파생된 페이지 컨트롤 기본 클래스의 LoadPageStateFromPersistenceMedium() 및 SavePageStateToPersistenceMedium(Object viewState) 메서드를 오버로드합니다. 코드는 다음과 같습니다.
1ViewState 데이터 로드 및 저장#region ViewState 데이터 로드 및 저장
2개의 보호된 재정의 객체 LoadPageStateFromPersistenceMedium()
3 {
4//직접 등록한 숨겨진 도메인 __SmartViewState에서 데이터 읽기
5 문자열 viewState = Request.Form["__SmartViewState"];
6바이트[]바이트 = Convert.FromBase64String(viewState);
7 //위에 제공된 정적 메서드 CompressionHelper.DeCompressByte()를 호출하여 데이터 압축을 푼다.
8바이트 = CompressionHelper.DeCompressByte(바이트);
9 LosFormatter 포맷터 = new LosFormatter();
10 반환 포맷터.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 보호된 재정의 void SavePageStateToPersistenceMedium(Object viewState)
15 {
16 LosFormatter 포맷터 = new LosFormatter();
17 StringWriter 작가 = 새로운 StringWriter();
18 formatter.Serialize(writer, viewState);
19 문자열 viewStateString =writer.ToString();
20바이트[]바이트 = Convert.FromBase64String(viewStateString);
21 //위에 제공된 정적 메서드 CompressionHelper.CompressByte()를 호출하여 데이터를 압축합니다.
22바이트 = CompressionHelper.CompressByte(바이트);
스물셋
24 //새 숨겨진 필드 __SmartViewState를 등록합니다. 직접 정의할 수도 있습니다.
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#끝지역
위 처리 후 웹 출력 페이지의 소스 코드는 다음과 같습니다.
원래의 숨겨진 필드 "__VIEWSTATE"는 빈 값을 가지며, 압축된 문자열을 저장하기 위해 자체적으로 등록한 새로운 숨겨진 필드 "__SmartViewState"로 대체됩니다. 이러한 방식으로 우리 프로젝트와 결합하면 속도 향상 효과가 분명해집니다. 예를 들어 DG3G.COM 홈페이지의 원래 ViewState 문자열 값은 약 28K이고 압축 후 7K인 반면, Acafa.com 홈페이지의 원래 ViewState 문자열 값은 약 43K이며 압축 후 8K입니다. 이런 처리는 상당히 만족스럽습니다. 물론, 충분하지 않다고 생각되면 ViewState 문자열을 Session에 저장할 수도 있습니다. 그러나 이렇게 하면 서버 메모리에 대한 부담이 급격히 증가하게 됩니다(특히 방문 횟수가 많을 경우). .. 가볍게 사용하지 않는 것이 좋습니다. 웹 서버에 10G 또는 8G 메모리가 있으면 시도해 보는 것이 좋습니다. 관련 수정된 코드는 다음과 같습니다.
위 LoadPageStateFromPersistenceMedium() 메서드 본문의 코드를 변경합니다.
string viewState = Request.Form["__SmartViewState"];
다음으로 수정:
string viewState = Session["__SmartViewState"].ToString();
동시에 위의 SavePageStateToPersistenceMedium() 본문에 코드를 추가합니다.
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
다음으로 수정:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
마지막으로 위의 코드와 솔루션은 모두 VS2003 개발 사례에서 나온 것입니다. 그러나 위의 내용을 통해 얻을 수 있는 것이 있는지 여부에 대해서는 약속하지 않습니다. 해결해 주시면 매우 기쁠 것입니다.