Если у вас есть привычка просматривать исходный код HTML текущей страницы, которую вы просматриваете в IE, вы часто можете видеть фрагменты кода, подобные следующим:
<input type="hidden" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
Если ты умный, ты обязательно спросишь, а что это? Что он делает? Какое отношение это имеет к этой статье? Дорогие читатели, пожалуйста, слушайте меня медленно.
Фактически, это характерная производительность применения технологии ViewState компанией MS в Asp.net. Чтобы страница по-прежнему могла читать исходные данные состояния серверного элемента управления после PostBack, Asp.net использует технологию ViewState, которая по существу использует поле формы скрытого типа с именем по умолчанию «__VIEWSTATE» для сохранения и передачи данных. (Эти данные представляют собой сериализованные строковые значения в кодировке Base64 и сохраняются перед выводом методом Page.SavePageStateToPersistenceMedium и загружаются Page.LoadPageStateFromPersistenceMedium). Хотя мы можем легко отключить круговой проход этих данных через три уровня Pass:
набор машинного уровня
.<pages EnableViewStateMac='false' /> в файле Machine.config
На уровне приложения установите <pages EnableViewStateMac='false' /> в файле web.config веб-приложения.
На уровне одной страницы установите < %@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 /// </summary>
21 /// <param name="data">Массив байтов для сжатия</param>
22 /// <returns>Сжатый массив байтов</returns>
23 общедоступных статических байта[] CompressByte(данные байта[])
двадцать четыре {
25 MemoryStream мс = новый MemoryStream();
26 Поток s = новый GZipOutputStream (мс);
27 с.Write(данные, 0, данные.Длина);
28 с.Закрыть();
29 вернуть ms.ToArray();
30}
31
32 /**//// <краткое содержание>
33 /// Распаковка данных
34 /// </summary>
35 /// <param name="data">Массив байтов для распаковки</param>
36 /// <returns>Распакованный массив байтов</returns>
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#конечный регион
После вышеуказанной обработки исходный код на странице веб-вывода выглядит следующим образом:
<input type="hidden" name="__SmartViewState" value="H4sIAPtPoNwA/81ce1PbWJb/ ……
<input type="hidden" name="__VIEWSTATE" value="" />
Исходное скрытое поле «__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. решения, буду очень рад.