ASP.NLМT предоставляет наборы HTTP-запросов как Name Val ueCollrcl ions (к набору cookie это не относится). Поскольку все наборы реализованы единообразно и одинаково предоставляют доступ к своим данным, для обработки большинства узлов requestvar достаточно одного общего метода. Метод NaraeValCol обработчика служит оболочкой вызова метода
SkiiiUliLNaiьrValCu!, который использует вспомогательную функцию SkinUtil.Name Val С о] Workhorse, преобразующую определенный элемент набора (collection entry) в XML. Если задано имя переменной, метод NauЎeV.il("'>l вызывает вспомогательную функцию только раз, в ином случае она вызывается по одному разу для каждого элемента набора,
ASP.NET предоставляет набор cookie в виде HupCookie«Л>1 Ieri ion — набора объектов HttpCookie. Кроме значения, объекты HttpCookie содержат информацию о домене, сроке действия, пути и параметрах з;мцп i ы, так что функции SkinXJtiLCookieColii CookieColWorkhorse работают практически идентично методам Na me Va! Col и NaweVaICo! Workhorse. Они отличаются лишь типом наборов и механизмом кодирования элементов наборов. Было бы неплохо использовать один набор методов для их обработки, но у объектов NameValueCollection и HttpCookieCollection нет общих родительских классов (кроме System.Object).
Преобразование
Обработав все следует применить и только по-
том отправить контент браузеру. Тэг transform может ссылаться на Х32Д' статически или динамически. Если в нем указан атрибут demiili. XSLT-файл для скина назначается статически. Но если в тэге заданы имена переменной и метода, обработчик определяет XSLT-файл вызовом указанного метода. Это очень похоже на способ обработки тэга Ўnci huнleall с тем отличием, что метод тэга transform возвращает не XML-узел, а строку.
После выбора XSLT-файла скина обработчик вызывает Млн) Uil.'i ransloiin для преобразования. Если вместо выбранного файла возвращается null или пустая строка, клиентскому браузеру передается простой XML без скина. В ином случае создается новый объект Xs'Transvo-ic, Он загружается с выбранным XSLT-файлом и применяется к XML DOM, содержащему контент. Для большей производительности XSLT-файл после загрузки в объект XslTransform помещается в кэш HTTP-контекста. При последующих запросах к этому XSLT-файлу обращаться к диску не понадобится. Для каждого элемента кэша создается объект который обеспечивает синхронизацию и автоматически удаляет объект из кэша, если XSLT-файл на диске изменяется. Объект XslTransform загружается и помещается в кэш следующим образом:
XslTransform xslt = (XslTransform)(context.Cache[xsltFile]);
if (xslt == null)
Г
xslt = new XslTransformO; xslt.Load(xsltFile); context.Cache.Irisert(xsltFile, xslt, new CacheDependency(i'.sltFil3));
}
null,
context.Response.Output);
Приложение-пример
В коде, который можно скачать к лол\ статье, вы найдете инструмент WebSkin HttpHandler и пример Web-приложения, работающего со скинами, - DevHawk Books. DevHawk Books выводит информацию о книге, ее авторе и издательстве из базы данных Pubs, Для запуска приложения нужен SQL Server или Microsoft SQL Server 2000 Desktop Engine (MSDE 2000). Каждая WebSkin-страница содержит тэг database, подключающийся к базе данных Pubs на Incalhi».! через доверяемое соединение. Если ваша база данных установлена в другом месте, измените строки подключения в тэгах database на каждой странице.


Заключение
ASP.NET как будто угадывает ваши желания. Если вы когда-нибудь смотрели на сайт и думали: «Мне нужно что-то другое», — то наверняка уже обнаружили, что архитекторы ASP.NET предусмотрели механизм, позволяющий подключать нестандартную функциональность. В данном случае
я заменяю встроенную поддержку Web-форм и Web-сервисов собственным механизмом, обслуживающим Web-запросы по своей схеме.
Масштабируемость WebSkirs можно повысить, создав механизм компиляции Web-страниц со скинами. Писать код, создающий другой код, всегда не просто, но Microsoft .NET Framework предоставляет объекты пространства имен CodeDOM, которые берут на себя всю «черную» работу.
