ПРИЛОЖЕНИЕ 1
Настройка среды для хостинга решений на MVC Framework
Задача хостинга приложений, написанных с помощью ASP.NET MVC, решается так же просто, как и задача хостинга обычных ASP.NET-приложений. На сегодняшний момент все компании, предоставляющие услуги хостинга, заявляют о поддержке ASP.NET MVC. На практике же поддержка ASP.NET MVC — это всего лишь маркетинговый ход, который позволяет добавить еще одну строчку в рекламный проспект. Так как сайты ASP.NET MVC могут работать везде, где работают обычные ASP.NET-сайты, никакой особой поддержки для ASP.NET MVC не требуется.
Однако, несмотря на потенциальную возможность запуска проектов ASP.NET MVC на любом ASP.NET-хостинге, вы можете столкнуться с рядом различных вариантов окружения и версий серверов IIS, которые потребуют разных решений и некоторых дополнительных действий. Рассмотрим самые важные из них.
Настройка маршрутизации
Для правильного функционирования механизма маршрутизации в ASP.NET MVC необходима корректная обработка сервером IIS расширений mvc, пути с которыми используются внутри MVC Framework. Эта проблема, если она возникла, довольно просто решается в случаях, когда вы имеете дело с хостингом на базе IIS7 (сегодня это наиболее распространенный вариант). Для решения проблемы вам необходимо с помощью административной панели инструментов, которую предлагает ваша хостинговая компания, установить режим работы приложения в IIS7 Integrated Mode вместо установленного по умолчанию режима IIS7 Classic Mode. Варианты доступа к этой опции могут отличаться в зависимости от хостера.
Если же вы имеете доступ к серверу IIS, то изменение режима работы IIS7 для вашего приложения выполняется через инструмент Internet Information Services Manager. В IIS Manager вам достаточно задать верный пул приложений для своего приложения, который бы работал в режиме IIS7 Integrated Mode, по умолчанию это Default Application Pool или DefaultAppPool (рис. П1.1).
Проблема маршрутизации особенно актуальна для хостинга ASP.NET MVC-приложений на IIS6, в котором необходимо проделать дополнительные действия.
Если вы имеете доступ к IIS-серверу и можете его конфигурировать (в случаях, когда вы производите самостоятельный хостинг или хостинг на виртуальных серверах), вам необходимо самостоятельно зарегистрировать для IIS6 обработку расширения mvc. Это можно проделать двумя способами.
□ Вы можете использовать скрипт register.wsf, который поставляется с ASP.NET MVC и расположен по адресу C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scripts или C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC\Scripts для 64-битных операционных систем. Скрипт register.wsf автоматически зарегистрирует обработку расширения mvc для IIS6.
□ Вместо использования скрипта вы можете проделать необходимые для регистрации действия собственноручно. Для этого необходимо пройти в свойства проекта, выбрать вкладку Virtual Directory и в ней нажать кнопку Configuration. В окне конфигурации приложения будет показан список привязок расширений к ISAPI-обработчикам. Добавьте новое расширение mvc и привяжите его к обработчику c:\WINDOWS\Microsoft.NET \Framework\v2.0.50727\aspnet_isapi.dll. Путь к обработчику ISAPI может отличаться, но вы можете определить верный, найдя сопоставленный путь для расширения aspx. После добавления обработчика вы увидите его в списке сопоставлений (рис. П1.2).
Рис. П1.2. Список сопоставлений расширений и ISAPI-обработчиков
□ После сопоставления расширения mvc для вашего приложения необходимо видоизменить создание маршрутов в Global.asax так, как показано в листинге П1.1.
Листинг П1.1. Модифицированный код Global.asax
using System;
using System.Collections.Generic;
using System.Linq; using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplicationl {
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}.mvc/{action}/{id}",
new { action = "Index", id = "" }
);
routes.MapRoute(
"Root",
"" ,
new { controller = "Home", action = "Index", id = "" }
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
Обратите внимание на выделенные участки кода листинга П1.1. Вместо создаваемого по умолчанию маршрута с шаблоном {controller}/{action}/{id}, для IIS6 необходимо создать маршрут с шаблоном {controller}.mvc/{action}/{id}. Плюс, для обработки запросов к корню приложения необходимо создать еще один маршрут с именем Root и пустым шаблоном маршрута.
После таких изменений каждый запрос к вашему приложению должен иметь вид {controller}.mvc/{action}/{id}, т. е. каждая строка имени контроллера должна заканчиваться с расширением mvc. Например: запрос /product.mvc/details/1 вызовет контроллер-действие Details в контроллере Product и передаст в параметр id значение 1.
В случае, когда вы не имеете доступа к конфигурированию сервера IIS и не можете задать сопоставление расширения и ISAPI-обработчика, то решением может стать использование вместо расширения mvc другого расширения, зарегистрированного в системе: axd, aspx, ashx. В таком случае описанный в листинге код должен быть модифицирован следующим образом:
routes.MapRoute(
"Default",
"{controller}.aspx/{action}/{id}",
new { action = "Index", id = "" }
);
Это означает, что все ваши запросы должны представлять собой подобие запроса /product.aspx/details/1 с расширением aspx для имени контроллера.
Ограничение IIS6 приводит к тому, что маршрутизация и строки URL-запросов к вашему приложению не будут выглядеть так же красиво, как в приложениях, работающих на базе IIS7. Кроме того, вам будет необходимо генерировать совместимые ссылки с определенными маршрутами и используемыми в них расширениями (mvc или aspx). Однако в настоящее время использование серверов IIS6 в компаниях, которые предлагают услуги хостинга, стремится к нулю, и все крупные хостеры уже предлагают хостинг на базе IIS7 или даже IIS7.5. Поэтому, перед тем как сделать выбор хостера, уточните, предлагает ли он сервер на базе IIS7, и если обнаружится, что он по какой-то причине до сих пор этого не делает, то, возможно, вам следует поискать другого, более современного хостера.
ПРИЛОЖЕНИЕ 2
Оптимизация производительности
Производительность веб-приложений играет огромную роль для построения успешных проектов в Интернете. В связи с тем, что к одному сайту одновременно могут обращаться сотни, тысячи и десятки тысяч человек, оптимизация производительности веб-приложений выходит на передний план.
Здесь мы дадим некоторые базовые советы по оптимизации как производительности приложений на сервере, так и на клиентской стороне в браузере пользователя.
Кэширование данных
Одним из базовых инструментов повышения производительности является кэширование сгенерированных данных, в основном, веб-страниц. В ASP.NET существует базовый инструмент кэширования данных с помощью директивы @outputcache, параметры которой позволяют управлять временем кэширования страницы и задавать условия, при которых кэширование происходит.
В ASP.NET MVC для кэширования результатов выполнения действий в контроллерах предлагается использовать специальный атрибут outputcacheAttribute, который представляет собой аналог директивы @outputcache. Например, далее представлен код, который позволяет кэшировать все результаты контроллера на 30 минут:
[OutputCache(Duration = 1800, VaryByParam = "none")]
public class AdminController : Controller
Подробнее параметры этого атрибута рассмотрены в главе 4.
С помощью атрибута OutputCacheAttribute вы можете решить проблему загруженного запросами сервера. Кэшированный результат запроса имеет определенный срок жизни, в течение которого вместо вторичного получения результата в ответ на запрос возвращается кэшированное значение. Иными словами, кэширование позволяет нам снизить нагрузку на ресурсы сервера путем возвращения одного и того же результата на разные запросы клиентов. Более того, механизм кэширования работает так, что браузер пользователя также кэширует результат и будет брать информацию о странице при повторном обращении из своего локального кэша, а не путем отправки запроса на сервер.
Кэширование может значительно разгрузить сервер, но в то же время не может быть использовано повсеместно из-за очевидных ограничений: там, где требуется постоянное обновление информации, кэширование будет мешать получать актуальные данные на момент времени. В связи с этим кэширование должно быть использовано там, где данные обновляются редко, либо получение данных связано с большими затратами ресурсов, например, при построении больших сводных отчетов с массой источников данных или при получении данных из удаленных сторонних источников.
Сжатие данных
Другим методом оптимизации производительности является сжатие данных для уменьшения размера потока данных между клиентом и сервером. В случаях, когда клиент имеет малую пропускную способность своего интернет-соединения, такой вид оптимизации будет играть существенную роль.
Сервер IIS, на котором работают приложения ASP.NET MVC, предлагает комплексный механизм, позволяющий на лету сжимать исходящие данные из сервера и принимать сжатые данные от клиента. Для включения этого механизма в IIS7 можно воспользоваться опцией Compression, в которой можно включить сжатие как статического (скрипты, CSS-стили), так и динамического контента.
В случае, если включение динамического сжатия недоступно, следует включить его поддержку через панель добавления инструментов Windows (рис. П2.1).
Сжатие данных, передаваемых между клиентом и сервером, работает следующим образом:
1. Клиент отправляет запрос серверу, в заголовке которого может передать информацию о том, что он поддерживает сжатие данных. Этот заголовок передается следующим образом: Accept-Encoding: gzip, deflate.
2. IIS-сервер, получив такой заголовок, уверен, что клиент может обрабатывать сжатые данные, поэтому, если разработчик настроил сервер на сжатие данных, результат запроса будет сжат с помощью алгоритма GZip или Deflate и отправлен клиенту со следующим опознавательным заголовком: Content-Encoding: gzip.
3. Клиентский браузер, получив данные с заголовком Content-Encoding: gzip, понимает, что данные сжаты и, используя свои встроенные механизмы, распаковывает их, чтобы отобразить результат запроса пользователю.
4. При разработке приложения и работе с механизмом сжатия на сервере IIS следует учитывать, что не все браузеры или другие клиентские приложения, которые отправляют запросы, могут поддерживать сжатие данных. Существует целый ряд клиентов, например, многие мобильные браузеры, которые не поддерживают сжатие передаваемых данных.
Уменьшение размера передаваемых файлов
Часто даже использование сжатия данных посредством сервера IIS не приносит требуемого результата по снижению объема передаваемых данных. Кроме того, сжатие не работает и не дает никакого эффекта с клиентами, которые его не поддерживают. В таких случаях требуется обратить внимание на сами передаваемые данные, в особенности данные из статических файлов: JavaScript-скриптов, CSS-стилей, файлов изображений и др.
Уменьшение JavaScript
Для уменьшения размера JavaScript-файлов существует целый ряд инструментов. Работа этих инструментов основана на том факте, что чаще всего JavaScript-файлы передаются в том же самом виде, в котором созданы разработчиком. То есть содержат массу символов разделителей, табуляции, переводов строк и комментариев, которые помогают разработчику лучше понимать код, но совершенно не нужны, когда речь идет о передаче от клиента к серверу.
Одним из таких инструментов по уменьшению размера JavaScript-файлов является Microsoft Ajax Minifier.
Примечание
Инструмент Microsoft Ajax Minifier бесплатен и может быть свободно скачен по адресу:
.
*************************
Microsoft Ajax Minifier поставляется в виде утилиты командной строки вместе с документацией и отдельной сборкой, которая позволяет использовать функционал Microsoft Ajax Minifier в ваших собственных приложениях.
Использовать Microsoft Ajax Minifier просто. Например, следующая команда сожмет содержимое файла inputfilejs:
ajaxmin inputfile.js
Для вывода результата сжатия в другой файл потребуется добавить параметр -o:
ajaxmin inputfile.js -o outputfile.js
Кроме того, Microsoft Ajax Minifier имеет еще целый ряд параметров для тонкой настройки механизма сжатия JavaScript и представления результата. Ознакомиться со всеми доступными параметрами можно, запустив без параметров приложение ajaxmin из командной строки.
Минимизация и сжатие JavaScript-файлов может значительно сократить размер передаваемых от сервера к клиенту данных. Так, например, минимизация исходного кода библиотеки jQuery позволяет сократить ее размер с 125 до 53 Кбайт.
Уменьшение CSS
JavaScript-файлы, как и файлы со стилями CSS, могут быть сжаты для уменьшения размера передаваемых данных. Для решения задачи минимизации CSS-файлов существует ряд инструментов, самый популярный из которых CSSTidy.
Примечание
CSSTidy можно скачать по адресу .
***********************
Использование CSSTidy по заверениям и тестам авторов может дать в среднем 33 % сжатия файлов со стилями. Для управления работой инструмента у него присутствует ряд параметров. Для минимизации файла достаточно указать его имя как параметр:
csstidy mycssfile.css
Для записи результата в другой файл необходимо указать имя выходного файла в виде второго параметра:
csstidy mycssfile.css myoutputfile.css
Остальные параметры можно получить, запустив csstidy без параметров.
Уменьшение изображений
Поскольку изображения — это важная часть почти каждого веб-сайта в Интернете, уменьшение размера изображений может принести значительный прирост производительности при передаче данных от сервера к клиенту.
Для оптимизации разных типов изображений можно воспользоваться разнообразными инструментами:
□ для уменьшения файлов изображений типа PNG без потери качества можно использовать популярный инструмент pngcrush (адрес проекта в Интернете );
□ для уменьшения и оптимизации файлов формата JPEG используется другой инструмент — jpegtran (скачать можно по адресу ), который позволяет, используя свойства JPEG, достигать более высокого уровня сжатия изображения;
□ для оптимизации GIF-изображений можно первоначально перевести их в PNG-формат с помощью инструмента gif2png (скачать можно по адресу ). В случае, когда GIF-файлы анимированы, их можно оптимизировать с помощью инструмента GIFsicle (скачать можно по адресу ).
Кроме программных инструментов по оптимизации изображений на компьютере есть ряд онлайн-ресурсов, которые позволяют сделать это так же эффективно. Одним из таких ресурсов является Smush.It от компании Yahoo!, который расположен по адресу .
Другие способы клиентской оптимизации
Кроме описанных ранее способов основной оптимизации есть еще несколько возможностей по увеличению отзывчивости и скорости работы вашего сайта.
Уменьшение количества запросов
По меркам скорости загрузки страниц каждый запрос браузера на сервер отнимает значительное время. Поэтому необходимо уменьшать количество обязательных запросов на сервер. Такие запросы формируются для каждого ресурса, используемого на странице. Таким образом, необходимо уменьшать количество уникальных ресурсов. Несколько советов помогут вам в этом:
□ собирайте все CSS-стили, используемые на странице, в один файл вместо использования нескольких отдельных CSS-файлов;
□ в случае, если код CSS-стилей небольшой по объему, рассмотрите возможность внедрения стилей в тело страницы вместо использования отдельного CSS-файла;
□ то же самое относится и к JavaScript-файлам, старайтесь избегать наличия нескольких JavaScript-файлов, вместо этого сведите их количество к минимуму;
□ все внешние статические ресурсы, такие как изображения, скрипты или стили, имеет смысл загружать со специального выделенного сервера, снижая нагрузку с основного сервера приложения;
□ в случае, когда нет возможности внедрить дополнительный сервер для статических ресурсов, рассмотрите возможности использования сторонних CDN-серверов для разного рода ресурсов. Например, скрипты jQuery могут быть загружены со специальных высокопроизводительных серверов Google или Microsoft. C серверов Microsoft можно загружать и многие другие скрипты: ASP.NET Ajax или jQuery Validation.
Уменьшение количества запросов на сервер не только разгрузит вам сервер, но и увеличит для вашего пользователя ощущение отзывчивости сайта.
Отказ от перенаправлений
Каждое перенаправление запроса (redirect) увеличивает для посетителя вашего сайта время ожидания. Старайтесь избегать перенаправлений и сведите их использование к минимуму или вовсе откажитесь от них.
Использование CSS Sprites
Техника спрайтов — это распространенная техника клиентской оптимизации работы с изображениями. Суть техники состоит в том, чтобы объединить набор небольших изображений в одно большое, чтобы впоследствии отображать куски этого изображения с помощью CSS-свойства background-position.
Преимущество такого метода в том, что вместо множества изображений с сервера загружается лишь одно. Таким образом, уменьшается количество запросов на сервер, увеличивается отзывчивость сайта, посетитель сайта быстрее получает результаты запроса.
Примечание
Подробное рассмотрение механизма спрайтов выходит за рамки этой книги. Однако мы должны отметить, что поддержка спрайтов, вероятно, будет включена в следующие версии ASP.NET MVC или AsP.NET MVC Futures.
**************************
Размер cookie
Так как cookie передаются с каждым запросом от клиента к серверу, следует избегать устанавливать на клиенте больших размеров cookie. Каждый элемент cookie может содержать до нескольких килобайт информации. Поэтому несколько таких элементов могут значительно увеличить поток данных. Здесь действует только одно правило: избегайте сохранения данных в cookie без особой нужды.
Заключение
Тенденции современного Интернета таковы, что значительная часть функционала переносится с сервера на браузер пользователя. Страницы сайта, которые ранее служили для простого отображения информации, теперь все чаще наполняются насыщенным JavaScript-кодом. В связи с ростом роли клиентского кода, вопросы клиентской оптимизации становятся все более важными.
В этом приложении были приведены некоторые техники, которые помогут вам создавать производительный и оптимизированный клиентский код. Используя их, вы сможете уменьшить нагрузку на сервер, увеличить отзывчивость сайта для клиента и значительно повысить производительность ваших проектов.
ПРИЛОЖЕНИЕ 3
Ресурсы по MVC Framework
Официальный сайт книги —
На сайте публикуются дополнительные материалы для дальнейшего изучения и практического применения MVC Framework.
Официальный сайт MVC Framework — .
На сайте можно найти ссылки на скачивание последних версий MVC Framework, исходных кодов библиотек, обучающего видео, а также множество статей и примеров использования MVC Framework. Сайт на английском языке.
Исходный код расширений ASP.NET — aspnet.codeplex.com.
На сайте представлен исходный код проектов, расширяющих возможности ASP.NET, а также полный архив исходного кода всех версий MVC Framework. Сайт на английском языке.