Если у вас есть привычка просматривать исходный код HTML текущей страницы, которую вы просматриваете в IE, вы часто можете видеть фрагменты кода, подобные следующим:
%@Page EnableViewStateMac='false' %> на странице или установите Page.EnableViewStateMac = false через код;
Однако, если мы сможем полностью решить проблему передачи данных, отключив ViewState, не вызывая при этом побочных эффектов, то архитекторы MS не будут настолько глупы, чтобы так мило (какой смысл оставлять его как ненужную вещь?), ведь мы часто Мы не можем решить эту проблему нагрузки на передачу, просто отключив ее, мы можем только найти другой путь, чтобы сделать объем передачи в сети туда и обратно как можно меньшим, поэтому сжатие стало нашим первым выбором. Пока мы перегружаем метод SavePageStateToPersistenceMedium() и метод LoadPageStateFromPersistenceMedium() класса Page, а также сжимаем и распаковываем данные в перегруженном методе. В поле нашего зрения попали классы GZipInputStream и GZipOutputStream, предоставленные проектом с открытым исходным кодом SharpZipLib. Для удобства мы могли бы также написать класс CompressionHelper со следующим кодом:
1using System.IO;
2с использованием ICSharpCode.SharpZipLib.GZip;
3
4пространство имен Ycweb.Components
5{
6 /**//// <сводка>
7 /// Краткое описание CompressionHelper.
8 /// сводка>
9 общедоступный класс CompressionHelper
10 {
11 publicCompressionHelper()
12 {
13 //
14 // TODO: добавьте сюда логику конструктора
15 //
16}
17
18 /**//// <краткое содержание>
19 /// Сжатие данных
20 ///
21 /// Массив байтов для сжатия
22 ///
23 общедоступных статических байта[] CompressByte(данные байта[])
двадцать четыре {
25 MemoryStream мс = новый MemoryStream();
26 Поток s = новый GZipOutputStream (мс);
27 с.Write(данные, 0, данные.Длина);
28 с.Закрыть();
29 вернуть ms.ToArray();
30}
31
32 /**//// <краткое содержание>
33 /// Распаковка данных
34 ///
35 /// Массив байтов для распаковки
36 ///
37 общедоступный статический байт [] DeCompressByte (данные байта [])
38 {
39 байт[] writeData = новый байт[2048];
40 MemoryStream мс = новый MemoryStream(данные);
41 Stream sm = новый GZipInputStream(ms) как поток;
42 MemoryStream outStream = новый MemoryStream();
43 пока (правда)
44 {
45 int size = sm.Read(writeData,0, writeData.Length);
46, если (размер >0)
47 {
48 outStream.Write(writeData,0,size);
49 }
еще 50
51 {
52 перерыв;
53}
54 }
55 см.Закрыть();
56 байт[] outArr = outStream.ToArray();
57 outStream.Close();
58 возврат outArr;
59 }
60 }
61} Затем мы перегружаем методы LoadPageStateFromPersistenceMedium() и SavePageStateToPersistenceMedium(Object viewState) в базовом классе управления страницами, производном от класса Page. Код выглядит следующим образом:
1Загрузка и сохранение данных ViewState#region Загрузка и сохранение данных ViewState
2 защищенный объект переопределения LoadPageStateFromPersistenceMedium()
3 {
4//Читать данные из скрытого домена __SmartViewState, зарегистрированного вами
5 строк viewState = Request.Form["__SmartViewState"];
6 байт[] байт = Convert.FromBase64String(viewState);
7 //Вызов статического метода CompressionHelper.DeCompressByte(), указанного выше, для распаковки данных.
8 байт = CompressionHelper.DeCompressByte(байты);
9 Форматер LosFormatter = новый LosFormatter();
10 return formatter.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 защищенное переопределение void SavePageStateToPersistenceMedium (Object viewState)
15 {
16 Форматер LosFormatter = новый LosFormatter();
17 Writer StringWriter = новый StringWriter();
18 formatter.Serialize(писатель, 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», зарегистрированным нами для хранения сжатой строки. Таким образом, эффект ускорения очевиден. Например, исходное строковое значение ViewState домашней страницы DG3G.COM составляет около 28 КБ и 7 КБ после сжатия, в то время как исходное строковое значение ViewState домашней страницы Acafa.com составляет около 43 КБ и 8 КБ после сжатия. Такая обработка вполне удовлетворительна. Конечно, если вы чувствуете, что это недостаточно тщательно, вы также можете сохранить строку ViewState в Session. Однако если вы это сделаете, нагрузка на память сервера резко возрастет (особенно при большом количестве посещений). . Не рекомендуется использовать его легкомысленно. Если ваш веб-сервер имеет память 10 ГБ или 8 ГБ, вы также можете попробовать. Соответствующий модифицированный код приведен ниже:
Измените код в приведенном выше теле метода LoadPageStateFromPersistenceMedium():
строка viewState = Request.Form["__SmartViewState"];
Изменить на:
строка viewState = Session["__SmartViewState"].ToString();
В то же время добавьте код в приведенное выше тело SavePageStateToPersistenceMedium():
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
Изменить на:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
Наконец, все приведенные выше коды и решения взяты из практики разработки VS2003. Однако я не даю никаких обещаний относительно того, подходит ли VS2005. решения, буду очень рад.