2009-05-12 2 views
2

В основном я работаю над сайтом, который пытается оптимизироваться для телефонов (это включает практически любой телефон с поддержкой браузера). Из-за характера сайта я хочу, чтобы он загружался как можно быстрее. На данный момент, я думаю, что страница размером около 30 тыс.ASP.Net ViewState Compression: Должен ли я беспокоиться?

Теперь я использую viewstate, в основном для таких вещей, как datagrids, а не для «сохранения» любых полей.

Я видел много примеров, подобных этому (I swear not my blog) с 2.0 в виду, но ничего, что касалось 3.5, заставляет меня задаться вопросом, изменилось ли с тех пор ничто, или сжатие состояния представлений не вышло из-под контроля.

Вопрос в том, должен ли я пытаться сжать вид в представлении или есть лучшее решение?

ответ

1

Я не думаю, что это испортилось, так как сохранение состояния представления в 2.0 должно работать так же, как сохранить его в 3.5. Лучший способ уменьшить viewstate - не использовать его, но это не всегда возможно.

В этих случаях вы должны поэкспериментировать с обменом пропускной способностью и дополнительным временем обработки, которое потребуется на сервере. Единственный способ узнать, стоит ли это делать и измерять влияние.

Редактировать

Другой вариант я видел, чтобы сохранить состояние представления на сервере. Его можно сохранить в памяти, в базе данных или на диске. В зависимости от ваших экологических требований. Это будет наибольшая экономия на пропускной способности.

Here's a code project article
Looks like a good article

0

Имея ViewState противоречит имея быстрый веб-страницу загрузки. Зачем вам ViewState? Пересмотрите свой дизайн и используйте как можно меньше. Я бы поставил на себя данные о сеансе на сервере и/или базе данных до тех пор, пока не будет причины хранить некоторые данные в ViewState.

+3

ViewState имеет это место (и затем некоторые), но выступать не использовать его вообще слишком экстремальный ИМО. Это неоценимо для хранения ключей идентификации, которые вы не хотите хранить в скрытых полях на странице (которые может испортить гнусный пользователь). Теперь, если вы храните целые DataSet или такие в нем, то, да, вам нужно переосмыслить свой игровой план. – Jagd

+0

AFAIK ... многие мои клиенты подходят ко мне для «нескольких улучшений и улучшения производительности». В этом случае я не могу пойти на изменение логики приложения для управления сеансом, закодированной другим программистом. Мне нужно быстро реализовать (как его называет клиент), чтобы улучшить скорость приложения. –

4

Я использую viewstate, в основном для таких вещей, как datagrids, а не для «сохранения» любых полей.

Это решетки, о которых я беспокоюсь больше всего. Поля, которые вы сами сохраняете, обычно являются простыми переменными, такими как идентификаторы базы данных или имена пользователей. Это не вызовет столько проблем, потому что они маленькие. Целые сетки потенциально могут быть большим количеством данных, и именно там вы столкнулись с проблемами.

Помните, что пользователь должен загружать содержимое окна просмотра из браузера на сервер, а затем загружать их обратно при каждой обратной передаче. Если у вас есть 100-мегабитное соединение с веб-сервером — как с корпоративным lan, где веб-формы имеют тенденцию быть более популярными —, тогда viewstate отлично. Но с браузерами сотовых телефонов многие пользователи могут быть в эквиваленте dial-up или даже хуже: , оплачивая байт. В этом случае я постараюсь работать с ним как можно больше, и только активировать его, когда это необходимо.

2

сжатие и данные в памяти

Прежде всего, нам нужен способ для сжатия и распаковки массива байт в памяти. Я собрал этот простой статический класс, который предоставляет два метода: «Сжать» и «Разложить».Два доступных класса, GZipStream и DeflateStream, согласно MSDN, используют один и тот же алгоритм, поэтому не имеет значения, какой из них вы выберете.

ниже код очень прост и не нуждается в дальнейшем объяснении:



    using System.IO; 
    using System.IO.Compression; 

    public static class Compressor { 

     public static byte[] Compress(byte[] data) { 
     MemoryStream output = new MemoryStream(); 
     GZipStream gzip = new GZipStream(output, 
          CompressionMode.Compress, true); 
     gzip.Write(data, 0, data.Length); 
     gzip.Close(); 
     return output.ToArray(); 
     } 

     public static byte[] Decompress(byte[] data) { 
     MemoryStream input = new MemoryStream(); 
     input.Write(data, 0, data.Length); 
     input.Position = 0; 
     GZipStream gzip = new GZipStream(input, 
          CompressionMode.Decompress, true); 
     MemoryStream output = new MemoryStream(); 
     byte[] buff = new byte[64]; 
     int read = -1; 
     read = gzip.Read(buff, 0, buff.Length); 
     while(read > 0) { 
      output.Write(buff, 0, read); 
      read = gzip.Read(buff, 0, buff.Length); 
     } 
     gzip.Close(); 
     return output.ToArray(); 
     } 
    } 

Вы должны сохранить этот класс в файле .cs и поместить его в каталог App_Code вашего приложения ASP.NET , убедившись, что он содержится в правильном пользовательском пространстве имен (если вы не укажете какое-либо пространство имен, класс будет доступен во встроенном пространстве имен ASP).

Сжатие ViewState

Теперь мы можем фактически сжать ViewState страницы. Для этого нам нужно переопределить два метода LoadPageStateFromPersistenceMedium и SavePageStateToPersistenceMedium. В коде просто используется дополнительное скрытое поле __VSTATE для хранения сжатого ViewState. Как вы можете видеть, просмотрев HTML-страницу, поле __VIEWSTATE пусто, а наше поле __VSTATE содержит сжатый ViewState, закодированный в Base64. Давайте посмотрим на код.



    public partial class MyPage : System.Web.UI.Page { 

     protected override object LoadPageStateFromPersistenceMedium() { 
     string viewState = Request.Form["__VSTATE"]; 
     byte[] bytes = Convert.FromBase64String(viewState); 
     bytes = Compressor.Decompress(bytes); 
     LosFormatter formatter = new LosFormatter(); 
     return formatter.Deserialize(Convert.ToBase64String(bytes)); 
     } 

     protected override void SavePageStateToPersistenceMedium(object viewState) { 
     LosFormatter formatter = new LosFormatter(); 
     StringWriter writer = new StringWriter(); 
     formatter.Serialize(writer, viewState); 
     string viewStateString = writer.ToString(); 
     byte[] bytes = Convert.FromBase64String(viewStateString); 
     bytes = Compressor.Compress(bytes); 
     ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes)); 
     } 

     // The rest of your code here... 

    } 

В первом методе, мы просто декодировать из Base64, распаковывать и десериализацию содержания __VSTATE, и вернуть его выполнение. Во втором методе мы выполняем противоположную операцию: сериализуем, сжимаем и кодируем в Base64. Строка Base64 затем сохраняется в скрытом поле __VSTATE. Объект LosFormatter выполняет задачи сериализации и десериализации.

Возможно, вы также захотите создать новый класс, например CompressedPage, наследующий от System.Web.UI.Page, в котором вы переопределяете эти два метода, а затем наследуете свою страницу от этого класса, например MyPage: CompressedPage , Просто помните, что .NET имеет только одно наследование, и, следуя этому пути, вы «тратите» свой единственный шанс наследования использовать сжатие ViewState. С другой стороны, переопределение двух методов в каждом классе - пустая трата времени, поэтому вы должны выбрать способ, который наилучшим образом соответствует вашим потребностям.

Выше было опубликовано Дарио Солера по кодепроекту. http://www.codeproject.com/Articles/14733/ViewState-Compression

+0

Вы должны отредактировать это, чтобы отформатировать исходный код, чтобы сделать его более разборчивым. –

+0

Я бы подумал, что включение сжатия GZip в IIS на всем сайте приведет к сжатию GZip только резервной копии ViewState – Mick

0

Сжатие видового склада может только уменьшить его на 50% или около того. Я сделал несколько шагов вперед и использовал технику замещения ViewState, где ViewState заменяется GUID на странице. Фактические данные ViewState сохраняются в базе данных на самом сервере, что клиент (браузер) получает и отправляет, это всего лишь 62-байтовый токен. Он уменьшил на 200-300KB большие ViewStates до 62 байтов.

Здесь я написал, как сделать это с кодом .. http://ashishnangla.com/2011/07/21/reducing-size-of-viewstate-in-asp-net-webforms-by-writing-a-custom-viewstate-provider-pagestatepersister-part-12/

Смежные вопросы