MCP

суббота, 30 января 2010 г.

Windows 7 Language Pack/MUI

Решил тут поставить русский MUI для системы, посмотреть что изменится (есть подозрения, что будет получше с поиском по-русски, возможно в мелочах тоже по-приятнее). И обнаружил, что в принципе, скачать это можно и бесплатно, но ISO занимает 2 с лишним гигабайта и включает в себя все языки. Может быть, я всего-лишь плохо искал, но когда качаешь ISO, не очень понятно, что получишь в конце. В конце же я получил много ненужного.

Реально при этом русский Language Pack занимает всего 70Mb (!!!). Так что я решил, что в принципе, не повредит выложить его отдельно, чтобы не выкачивать всё. Заодно решил и английский добавить для тех, у кого русская система.

Выложить решил на SkyDrive, ибо там всё хорошо со скоростью и доступностью, правда максимальный размер 50Mb, так что пришлось бить на две части.

Итак, по-пунктам:
  1. Данный MUI или Language Pack (я запутался как их называть) подходит для любой Windows 7 и любого Windows Server 2008 R2 (и это меня радует)
  2. Перед скачиванием найдите и прочитайте лицензию, убедитесь что вы ничего не нарушаете и что вам никто ничего не должен
  3.  После скачивания распакуйте всё в какую-нибудь папку, чтобы в конце получилось что-то типа langPackFolder/ru-ru/lp.cab (или en-us, смотря что вам надо)
  4. Далее заходите в Панель Управления, Региональные настройки, выбираете Добавить/удалить языки и там выбираете вашу папку langPack 
Ну и самое важное, ссылки:
Русский:  часть 1, часть 2
English: part 1, part 2

Update: Меня тут поправили, что для Windows 7 Ultimate — language pack можно скачать через апдейты, а для других, как я понимаю и не получится. Так что мой пост больше относится к серверным версиям и случаю, когда с интернетом всё плохо, так что 70Mb проще скачать заранее из другого места.

вторник, 26 января 2010 г.

Градусник. Последние изменения

С момента последнего поста про градусник прошло достаточно много времени, но напишу я только о недавних, заметных изменениях. Конечно, если вы не заходили на сайт с того момента, то вы увидите как всё сильно изменилось, но в последние пару месяцев стало ещё лучше .

Итак, кроме исправления старых багов (на сайте и в программе) и добавления новых, изменения внутренней архитектуры на более удобную и функциональную, из заметных изменений можно выделить следующие (без какого либо порядка: алфавитного, временного или по-важности):

1. Изменение домена на .com
Теперь сайт переехал на новый домен yartemp.com, со старого .co.cc, так что теперь всё гораздо солиднее, ну и удобнее мне для управления.  Будем надеяться, что этот домен Яндекс всё-таки осилит и сможет заиндексировать. Всё-таки у него алгоритмы на порядок хуже, если сравнивать с гуглом и бингом. Гугл, так вообще копается в сайте, как у меня дома

2. Появился более или менее нормальный F.A.Q.
Теперь хотя бы пользователи смогут прочитать о том как всё работает и какие проблемы бывают.

3. Теперь на графике показываются день и ночь
Т.е. восход и закат, если говорить научно. Выглядит это примерно так:

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

4. Картинки с графиками теперь сжимаются более эффективно
В код добавлен алгоритм, который сжимает картинки раза в 2 относительно стандартных средств .NET, это всё делается в фоне и незаметно для пользователей, в результате страница обновляется ещё быстрее, и трафика потребляется ещё меньше.

Также ещё есть небольшие изменения и новые фичи, о них рассказано в F.A.Q., в программе yarTemp исправлены некоторые ошибки, теперь она чуть лучше работает на x64 системах, но о наиболее интересных улучшениях я решил написать тут, чтобы знали, что работа идёт, сайт совершенствуется. За последний месяц количество посетителей увеличилось где-то в 3 раза, и это без активной рекламы с моей стороны, что не может не радовать. Всё-таки приятно, когда люди получают свежую и актуальную информацию. Посмотрим, что будет дальше.

понедельник, 18 января 2010 г.

DefaultHttpHandler + PNG + FireFox

Я писал про использование DefaultHttpHandler для отдачи файлов, принципиально ничего не изменилось, я по-прежнему считаю это неплохим способом, но недавно была обнаружена небольшая проблема с этим способом.

Проблема заключается в том, что в .NET 3.5 SP1 (специально уточняю версию, ибо подобный код имеет тенденцию изменяться) данный метод не знает тип MIME для png-файлов и вместо image/png отдаёт application/octet-stream.

Что самое интересное, в большинстве случаев тут ничего страшного нет. Практически все браузеры определят содержимое по контексту и содержимому файла. Но есть одно досадное исключение , и исключение это зовут FireFox. Если попробовать скачать файл в лоб, то он не посмотрит на то, что это картинка и предложит сохранить его.

Так что не забудьте добавить дополнительный код для png-файлов, выставляющий правильный Content-Type. Хотя у меня такое предположение, что в 4-ом фреймворке всё-таки научится данный метод отдавать правильный тип для png-файлов, а также, возможно и других, чуть менее распространённых.

пятница, 8 января 2010 г.

Бекап системы через виртуалку

Есть люди, которые переставляют операционку раз в месяц. Я к ним не отношусь, и предыдущая система у меня жила около 6 лет (может даже больше, хвосты идут с 2001-ого года). И апгрейдить я её решил из-за того, что уже пора.  Надо двигаться дальше и разбираться в новых технологиях.

При этом, терять все настройки, накопленные за такое время очень не хотелось: хоть и много хлама в старой системе, всё-таки есть полезные и настроенные программы, о которых вспоминаешь в самый ответственный момент, и устанавливать их заново, иногда просто не бывает времени. Надо взять и использовать.

Собственно встал вопрос, что с этим делать. Апгрейд системы у меня не получался, да и после апгрейда обычно получаются глюки, да и сохраняется ненужный хлам, от которого действительно нужно избавиться. Поэтому я решил сделать финт ушами и завернуть старую систему в виртуальную машину, которую потом поднять на новой системе и использовать, пока не будет всё окончательно настроено и установлено (а потом использовать в ситуациях, когда нужно работать со старой, настроенной программой, у которой проблемы в новой системе). 

Собственно, о том, как всё это сделать, я и расскажу, возможно это вам пригодится. Заодно, это будет полезно на работе, если вы хотите переделать сервер в виртуальную машину, чтобы потом его было легко перемещать между физическими компьютерами и избавиться от проблем с железом (умер физический сервер, поднимаем виртуалку на другом, а этот не торопясь восстанавливаем без давления коллег достающих фразой "ничего не работает"). Кстати, на работе для виртуалок рекомендую использовать Microsoft Hyper-V Server, он бесплатный, т.е. не надо дополнительно платить за лицензию на хостовую систему. Т.е. всё просто замечательно в этом плане.

Для дома же, думаю проще использовать VirtualPC или VirtualBOX. Они тоже бесплатные, и неплохо работают. VirtualBOX более навороченный и поддерживает виртуальные жёсткие диски больше 127Gb. В тоже время, в Windows 7, VirtualPC уже встроен (для работы XP Mode), так что он как бы "роднее", поэтому выбор за вами. В любом случае, попробовать можно оба варианта и остановиться на более подходящем.

Итак, приступим.

0. Оцениваем размер свободного места для бекапа. Лучше, чтобы было места в количестве размера диска C: Если же нет такого объёма, но вам хочется это сделать, то прочитайте до конца и подумайте, сколько вам нужно освободить.

1. Берём программу Disk2vhd от Марка Руссиновича и делаем образ диска C: (остальные диски можно будет потом подключить как сетевые, но если у вас достаточно места, и хотите надёжный бекап, можно сделать образ всего).

Делать образ можно хоть на тот же самый диск, но естественно, для производительности нужно на другой. Программа сразу говорит необходимый объём места с учётом только занятого места. Т.е. если у вас диск C имеет объём 500Gb, но при этом занято только 20Gb, то только 20Gb и потребуется. 

2. После изготовления образа, создаём в VirtualPC или VirtualBOX виртуальную машину, подцепляем к ней диск (если диск больше чем 127Gb, то используйте VirtualPC аккуратно, он плохо поддерживает большие диски), и смотрим на клон вашей системы только в отдельном окне. Зрелище потрясающее.

2а. Если система не поднялась с первого раза, то могут быть следующие проблемы:

  • Проблема с файловой системой, которая почему-то некорректно создалась. Придётся лечить всякими утилитами для восстановления разделов (например TestDisk). Для удобства, можете поднять отдельную систему на виртуалке, подцепить к ней этот проблемный образ и его чинить.
  • Проблемы с загрузкой, когда система не может загрузиться. Тут неплохо помогает загрузочный диск (вам достаточно иметь ISO с ним) от Vista или Windows 7. Запускаете Startup Repair и он может подлечить некоторые проблемы
  • Проблема с загрузкой виртуальной системы (синий экран, перезагрузки). Тут уже всё хуже, пробуем грузиться в Safe Mode, или делаем жёсткий Repair с установочного диска. (когда создаёте образ, можете поиграться еще с галочкой Fix HAL).

И помните, что на данном этапе, если вы что-то совсем разломаете, вы всегда можете начать всё сначала, и попробовать снова.

3. Когда виртуальная система заработала, можно удалить явно ненужные программы и файлы (для экономии места), сделать дефрагментацию, взять программу SDelete, запустить её с ключом -z (забить нулями свободное место). После этого на физической системе взять VirtualPC и сжать образ для экономии места. Но, можете этого и не делать, или сделать потом, когда будет новая система.

Вот и всё. Теперь у вас есть виртуалка со старой системой, которая будет работать на любом компьютере. Т.е. мы отвязались от железа и можем приступать к установке новой. После установки, поднимаем виртуалку и не торопясь переносим настройки из старой системы, в новую.

Несколько слов, про установку Windows 7 или Vista:

  • Чтобы полностью избавиться от старой системы без форматирования жёсткого диска при загрузке в Setup нажимаем Shift-F10, открывается консоль, там переименовываем или удаляем следующие папки: Documents And Settings (в XP), Users (в Vista), Program Files, Windows. Всё, у нас больше нет старой системы. Т.е. установка не будет лавировать между ними записывая новые данные, а просто установится чистой и блестящей. При этом, если что-то пойдёт не так, переименовываем папки обратно и возвращаем всё как было.
  • Если Windows откажется ставится на данный жёсткий диск, про причине его "неправильности", с помощью сторонних утилит выделяем вначале диска 100Mb, для личных нужд Windows. Эти 100Mb при загрузке система автоматически возьмёт себе и создаст там маленький образ для восстановления системы
  • Если не хочется ставить систему с диска, можно поставить с флешки. Для этого достаточно взять бесплатную программу Windows 7 USB/DVD Tool и она сама всё сделает (как вариант, можно попробовать UNetbootin — она больше для автоматического создания Linux-образов, но думаю и для этого подойдет)
  • После установки, можно для большинства программ перенести настройки с помощью копирования старых из Documents And Settings в новые Users (только следите за путями, если они абсолютные)

Ну вот и всё. У вас есть новая система и рабочая старая. При этом, если с новой что-то случится, вы можете с чистой совестью всё установить заново, при этом у вас всегда будет готовая и настроенная старая. Свежую же систему апгрейдить ещё проще. У Microsoft'а появились неплохие утилиты для бекапа настроек и миграции, так что можно всё сделать ещё проще. С другой стороны, при оборачивании старой системы в виртуалку, мы всегда оставляем пути отхода, на случай, если что-то пойдёт не так и мы всё сломаем. Так что, это хоть и немного дольше, и требует много места, зато обеспечивает сохранность данных.

вторник, 8 декабря 2009 г.

70-536

Несмотря на то, что данный экзамен я сдал ещё в пятницу, всё не доходили руки написать впечатления от него. Ибо писать собственно-то и нечего.

Экзамен весьма простой, как-то даже странно сравнивать его с 70-562, ибо многие вопросы можно отвечать не задумываясь, для других, достаточно вдумчиво почитать вопрос, чтобы отсечь неверные ответы. Хотя, конечно, бывают и сложные вопросы, у меня возникли проблемы где-то с пятью вопросами, сколько реально ошибок сделал — неизвестно, но не очень много. Ибо итоговый результат: 953 балла из 1000.

Тем, кто собрался что-то сдавать, рекомендую начать с него, чтобы оценить свои силы. Материалов для подготовки по всему интернету лежит достаточно, при этом, достаточно только базовых знаний. Например, у меня попался всего один вопрос с generic'ами, пара вопросов на стандартные типы, всё остальное в принципе, напрямую к .NET 2.0 не относится (а 3.5 и не пахнет).

В принципе, особое внимание рекомендую уделить (т.к. практически никто этим не занимается): Code Access Security, System Security, Installers, Services. Ну, можно немножко еще глянуть на глобализацию и локализацию . Ну и немножко вспомнить стандартные типы, потоки, и дебаггинг. Хотя там в общем-то можно и догадаться.

В общем, на этом всё, я теперь буду пробовать готовиться к Pro-экзамену 70-564. Ден Гладких утверждает что он простой и нелепый. 

пятница, 27 ноября 2009 г.

Сдача сертификационных экзаменов Microsoft в Ярославле

Собственно, данный пост пишу как отчёт, и как руководство к действию для коллег и желающих сдать экзамен и получить статус. Возможно, если осилите его, то будет всё проще (хотя казалось бы, куда ещё).  Поэтому, на всякий случай напишу очень подробно. Если меня не хватит, или наоборот, я надоем, то можно почитать про опыт Дена Гладких, расписано всё неплохо и коротко. Итак, понеслась:

Зачем всё это нужно?

Думаю, каждый должен решить это сам. Например, я решил так, что если я могу сдать, то почему-бы и нет? Стоит это не очень дорого, на первый взгляд всё не очень сложно, да и стоит попробовать себя в этом. Собственно собирался сдавать я давно (года этак 4 назад начал собираться ), но сдаться решил только сейчас.

Собственно, из плюшек и бенефитов вы получаете только статус MCP, красивый логотипчик и сертификат, и в общем-то всё. Естественно, понты, это святое, и повесить красивую бумажку на стену, или показать её работодателю, это может быть важной причиной.  Но ещё раз повторюсь, реальных, физических подарков вы не получите. Возможно попадёте где-нибудь под акцию, получите книжку, или можете сдать другие экзамены со скидкой, но это в общем-то не очень существенно. Возможно, магазин MCP eStore окажется для вас неплохим вариантом (кружки, ручки, сумки, майки), но доставка в Россию стоит $100, так что лучше для такого искать другие магазины.

Какая бывает сертификация?

Расскажу только в контексте разработчиков, ибо тут всё коротко и просто. Для админов список гораздо шире. Собственно, открываем соответствующий сайт и всё видим. Если не брать в расчёт устаревшие экзамены то получаем:

  • MCP(Microsoft Certified Professional) это даже не статус, а просто факт того, что ты уже что-то сдал и получил доступ к сайту. Никаких бумажек и логотипов, но для сайтов, связанных с Microsoft этого уже достаточно (itcommunity.ru, MCP-клубы, партнёрская программа)
  • MCTS(Microsoft Certified Technology Specialist) базовый статус, который подтверждает знание какой-либо технологии. Если сдавать экзамены из разных областей, то можно набрать толпу таких статусов и получить кучу сертификатов. Полностью он будет выглядеть примерно так (мой текущий статус):
     
  • MCPD(Microsoft Certified Professional Developer) Собственно главный статус для разработчика. Опять же, можно получить несколько таких статусов, самый крутой: Enterprise Application Developer 3.5, но всё равно обидно, что кончились всякие MCAD и MCSD.

Теперь, собственно о том, какие варианты есть конкретно для .NET разработчика:

  • Базовый экзамен, который практически необходим 70-536 (TS: Microsoft .NET Framework – Application Development Foundation), требуется для получения любого другого статуса. Так что рекомендую начинать сдавать с него, если вы ещё не решили, в какую сторону пойдёте. Начинайте с него и не прогадаете.
  • Для того, чтобы получить MCTS нужно сдать по крайней мере 2 экзамена. Собственно, я двигаюсь в сторону .NET Framework 3.5, ASP.NET Applications, так что начал с 70-562 (TS: Microsoft .NET Framework 3.5, ASP.NET Application Development), хотя он должен быть вторым.
  • Чтобы получить MCPD, нужно сдать специальный "Pro" экзамен по выбранной специализации. Т.е. в моём случае: 70-564 (PRO: Designing and Developing ASP.NET Applications Using Microsoft .NET Framework 3.5)
  • Когда выйдет .NET Framework 4.0, дожен появиться специальные Upgrade экзамен, так что, как вы его сдадите, вы получите уже MCPD по 4.0, и не надо будет сдавать всё заново. Но за один экзамен всё-таки заплатить придётся. Так что можете ждать фреймворка 4.0 и не сдавать экзамены 

Собственно, это про экзамены. Ещё раз сайт, на котором можно всё поглядеть и почитать: www.microsoft.com/learning/

Как зарегистрироваться?

Тут, в общем, есть два пути: Prometric и личная явка в сертификационный центр. Первый вариант позволяет проделать все операции сидя за компьютером (к тому же он дешевле), второй позволяет оплатить рублями, назначить экзамен в тот этот же день, да и вообще, идёт общение с живым человеком.  В Ярославле есть 3 сертификационных центра (на пятой странице прометрика, чтобы потом не искать долго):

  • Интернет Центр ЯрГУ (я там сдавал экзамен). В первом корпусе. Тел. 79-77-31
  • КАМИ (вроде первый в Ярославле). Чайковского, 40A (рядом с Мелоди-клабом). Тел. 72-75-55
  • Академия МУБиНТ. Советская 80. Тел. 8-915-969-90-99. Это рядом с Шинным.

Так, что смотрите, где вам удобнее, и можете туда звонить, или идти на Прометрик. Уточню: сдаёте экзамен вы не Microsoft, а отдельной конторе, точнее организации, с кем прометрик заключил договор. Соответственно на них накладываются определённые требования, так что в разных организациях всё должно быть примерно одинаково и принципиальной не должно быть. Кстати, можно сдавать не только экзамены Microsoft, но и другие, но тут я ничего не могу подсказать.

Собственно, как регистрироваться через прометрик:

  1. Идём сюда, и набираем ваучеров для скидок (15-25%, действуют до конца года). Чтобы потом не возвращаться, можно взять сразу три ваучера (они придут на почту), и потом их использовать.
  2. Идём вбивать данные на сайт прометрика: register.prometric.com
  3. Там всё по шагам, так что сложностей не должно возникнуть. В конце нас попросят зарегистрировать и оплатить стоимость экзамена. Так что, если есть карточка, то платим (через paypal нельзя, только в лоб, так что решайте, доверять или нет). Без скидок экзамен стоит $50.
  4. Ждём указанного времени, и минут за 15 приходим сдаваться.
  5. Если не получается в указанное время, можно изменить расписание, или вообще отказаться (вроде за сутки до сдачи, но это лучше уточнить).

Уточнение: Я сдавал в интернет центре ЯрГУ, и меня попросили всё-таки им позвонить, причём до регистрации. Т.е. конечно, они меня примут в любое время дня и ночи, но лучше всё же договориться заранее. Кроме того, они сказали про какой-то сдвиг, так что возможно они скажут что лучше немного другое время указать.

Процесс сдачи

Итак, вы всё-таки заявились на экзамен. Тут всё просто. Нужны права и паспорт (тем, у кого нет прав, наверное нужно позвонить уточнить, что можно принести в замен, и нужно ли в принципе). Когда вы придёте, все документы уже будут готовы и вам всего-лишь нужно подписать бумаги о том, что вы завещаете всё свое имущество будете хорошо себя вести и не списывать. Потом вы дожны отдать все свои вещи и выключить телефон (и лучше его тоже отдать ), получите маркеры и пластиковый листок в качестве черновика (как я понимаю, это всё многоразовое и основная цель, чтобы листок с записями вы не утащили с собой или чтобы сотрудники не выкинули его в мусор), место за компьютером и сам тест.

Собственно все вопросы выдаются прометриком и идут через специальную программу. Пользоваться можно только маркером и калькулятором встроенным в тест (если нужно что-нибудь посчитать). Сотрудников можно вызывать только в случае проблем с компьютером.

Вначале возможно будет небольшой опросник, текст соглашения, возможно, небольшой опросник о ваших предполагаемых знаниях, а потом сам тест. На него даётся 3 часа (на 50 вопросов), что весьма дофига. Я управился со всем за 2, и при этом много тупил. Т.е. при желании можно уложиться и в час (только надо ли?). К любым вопросам можно всегда возвращаться, можно помечать их для последующего просмотра, можно менять решение. Тут никаких ограничений нет. Это весьма удобно, сложные вопросы можно уже пересмотреть в конце экзамена, когда на всё уже ответил и время не давит.

Сами вопросы обычно предлагают выбрать один правильный из четырёх вариантов. Изредка бывает выбор двух-трех вариантов (всегда пишут нужное количество). Вопросы грамотные и сводятся к вариантам вида где мы пропустили запятую? С другой стороны, иногда раздражает, что бывают вопросы, на которые ты просто не помнишь правильный ответ, но знаешь, что из MSDN ты найдёшь его за минуту (с непрограммерскими экзаменами, ещё хуже, бывают задания, которые в жизни делаешь на автомате, и по пунктам уже объяснить не можешь, ибо спинным мозгом нажимаешь на кнопки, а приходится выбирать правильный вариант).

После сдачи, можно будет написать комментарий об умственных способностях составителя, о качестве каждого вопроса, о самой процедуре проведения экзамена (уходит прямо в прометрик, судя по всему, проверяют организацию, которая устраивает экзамен). От них можно отказаться, можно ответить. На это даётся дополнительное время, всё добровольно. При этом вам сразу же говорится, сдали вы экзамен или нет, и автоматом печатается листок с конкретными цифрами, и шкалами вида Тема: слабо/сильно. Т.е. конкретные ошибки неизвестны. Но примерно оценить проблемные темы можно.

На этот листок вам ставят хитрую печать, после этого вы должны его посмотреть, запомнить и съесть. Ибо данные цифры и шкалы больше нигде и никогда не покажутся, это ваше личное дело, что вы знаете. И даже если набрали 701 балл при допустимых 700, этого вы никому не обязаны говорить. Говорите, что 1000, всё равно не проверят.


Далее, если вы в первый раз сдаёте, то вам через некоторое время придёт MCP ID, для регистрации на mcp.microsoft.com, там вы можете сотворить свои логотипы, получить PDF с сертификатом или заказать его ($10 за один + $1 за каждый последующий в одной посылке), на сертификате будет стоять личная подпись самого Стивена Балмера.  Официальный способ при этом подтвердить статус, это Transcript. Для доступа к нему нужен код доступа, который вы придумываете сами и всегда можете изменить, чтобы прекратить к нему доступ. Так что сертификаты, это в общем-то баловство, но красивое.

Подготовка

Ну и в конце, о том как готовиться. Тут я не помощник. Я почти не готовился, решил что свои-то 700 баллов наберу, и очень пожалел. При сдаче экзамена, сомневался практически в каждом вопросе, было ощущение, что я вообще первый раз вижу этот .NET, и вообще, кто здесь?  

Темы для подготовки есть в описании экзамена, а уж как вы будете готовиться: читать книжки, курить брейндампы, копать MSDN или смотреть доклады, решайте сами. Глубоких знаний не требуется, но требуются достаточно широкие (e.g. 70-562): Microsoft AJAX, Mobile Controls, Declarative Data Sources, Control Lifecycle, Deployment, Configuring, Security. 

Вообще, могу сказать, что на MesureUp вопросы близко к теме, а на BrainBench — вообще не в тему.

воскресенье, 22 ноября 2009 г.

Сжатие ViewState

ViewState — в ASP.NET весьма интересная и полезная технология, но у неё есть один существенный недостаток. ViewState может очень сильно увеличивать размер страницы, и кроме всего прочего все эти данные пойдут на сервер назад, что для пользователей с узким каналом может выливаться в "тормоза" приложения, хотя само-то оно будет быстрым.

И что самое неприятное, все эти проблемы активно вылезают обычно ближе к окончанию проекта, когда всё уже сделано, и менять уже логику поздно. Точнее, смена логики может привести к непредсказуемым глюкам, а если всё тестировать заново, то это займёт слишком много ресурсов, так что обычно всё так и оставляют, и на будущее все программисты твёрдо себе говорят: в следующем проекте будем следить за ViewState. Но вы поняли. 

Собственно, есть ситуация, проект близится к концу, нужно что-то с ViewState'ом делать. Для начала, стоит взять типичную страницу, забрать из неё ViewState (он хранится в hidden-поле __VIEWSTATE), убрать кодирование в base-64 (сам ViewState не должен быть зашифрован, естественно), и посмотреть на него. На данном этапе иногда можно выкинуть некоторые элементы, которые случайно попали туда. Например, в одном проекте часть рендера страницы выводилась через asp:Literal, который по умолчанию пихает всё свое содержимое во ViewState, что, например, для русского текста длинной в 100 байт превратится в 300 байт на клиенте.

Но, когда базовые вещи исключены, всё равно может остаться большой вьюстейт (например, у нас в одном проекте с хитрым гридом он был 80 килобайт), и с ним надо что-то кардинально сделать. В этом случае, можно попробовать самое простое решение: сжать вьюстейт, благо ASP.NET предоставляет достаточно простую возможность для этого.

Вначале, нам необходимо переопределить PageStatePersister, собственно, тот класс, который и отвечает за хранение. В ASP.NET существуют две реализации, которые хранят ViewState в hidden-поле (по умолчанию) или в сессии. Нам нужен свой, который будет сжимать содержимое:


protected override PageStatePersister PageStatePersister
{
    get
    {
        return _persister ?? (_persister = new CompressionPageStatePersister(this));
    }
}

Для этого перекрываем property PageStatePersister у страницы (Page), и возвращаем инстанс нашего класса:


public class CompressionPageStatePersister : PageStatePersister
{
    public CompressionPageStatePersister(Page page) : base(page) { }
    public override void Load()
    {
        string requestViewStateString = base.Page.Request.Form["__CVIEWSTATE"];
        if (!string.IsNullOrEmpty(requestViewStateString))
        {
            Pair pair = (Pair)
                ViewStateCompressor.ViewStateDecompress(
                    Convert.FromBase64String(
                        requestViewStateString));
            base.ViewState = pair.First;
            base.ControlState = pair.Second;
        }
    }

    public override void Save()
    {
        Control control = base.Page.FindControl("__CVIEWSTATE");
        if ((base.ViewState != null) || (base.ControlState != null))
        {
            string s = Convert.ToBase64String(
                ViewStateCompressor.ViewStateCompress(
                    new Pair(base.ViewState, base.ControlState)));
            ScriptManager.RegisterHiddenField(base.Page, "__CVIEWSTATE", s);
        }
    }
}

Как видно, реализация простейшая, перекрываются методы Save и Load, которые сохраняют и загружают ControlState (неотключаемая часть, необходимая для работы контролов) и ViewState. Всё это сохраняается в собственное hidden-поле __CVIEWSTATE, т.к. к обычному у нас нет доступа (но если интересно, то с использованием Reflection, нужно взять private field у класса Page с именем _clientState, и записать значение туда).

Да, и в base-64 кодировать обязательно, ибо особенности стандарта HTTP таковы, что даже если вы попробуете другую кодировку, в реальности будет передано гораздо больше байт.

Ну, и собственно про сжатие, точнее про ViewStateCompressor, это небольшой класс, который сериализует данные и сжимает с помощью GZip:


public static byte[] ViewStateCompress(object viewStateToCompress)
{
    ObjectStateFormatter formatter = new ObjectStateFormatter();
    MemoryStream output0 = new MemoryStream();
    DeflaterOutputStream ds = new DeflaterOutputStream(output0, new Deflater(6, true));
    formatter.Serialize(ds, viewStateToCompress);
    ds.Close();
    return output0.ToArray();
}

public static object ViewStateDecompress(byte[] data)
{
    ObjectStateFormatter formatter = new ObjectStateFormatter();
    InflaterInputStream ds = new InflaterInputStream(new MemoryStream(data), new Inflater(true));
    object value = formatter.Deserialize(ds);
    ds.Close();
    return value;
}

Небольшие пояснения:

  • Для сжатия используется библиотека #zipLib (родная медленнее и хуже жмёт, использовать не стоит)
  • Степень сжатия (6) — это по умолчанию, наилучший компромисс качества и скорости
  • Не пишутся заголовки GZip, так как они нам не нужны, т.е. другими словами использоуется не GZip, а Deflate — алгоритм сжатия без дополнительной информации
  • В качестве сериализатора используется ObjectStateFormatter, который и используется в качестве стандартного (точнее там используется LosFormatter, но итогом работы служит строка в base-64, а мы сами потом трансформируем уже запакованные данные
  • В данном случае мы теряем встроенную возможность шифрования ViewState, но её при необходимости легко реализовать, да и расшифровать ViewState будет уже сложнее

Как видно, всё просто: два класса для удобства и один override, и результат — размер данных на клиенте в 2-5 раз меньше, и не на магистральных каналах страницы начинают работать гораздо быстрее.

Да, и постарайтесь не сохранять во ViewState собственные объекты, ибо ObjectStateFormatter достаточно эффективно сериализует базовые типы, но если он не понял про тип, то начинает использовать недостаточно эффективный, но универсальный BinaryFormatter. Если будет время, я постараюсь расписать, как в некоторых случаях можно подменить сериализацию для своих типов, чтобы уменьшить размер ViewState (который из-за этого может тоже весьма значительно сократиться).