Если имя переменной не указано, в DOM включается весь набор. Задавая целевое пространство имен, вы сопоставляете создаваемому XML-доку­менту определенное пространство имен. Если оно не указано, использует­ся пространство имен родительского узла.

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 на каждой странице.


На рис. 1 показан простой XSLT-скин, отображающий черный текст на белом фоне, а на рис. 2 - более красивый XSLT-скин с цветным логоти­пом. Переключение между ними выполняется вызовом метода SetSkin объекта Controller. Он получает имя нового скина из строки запроса и за­писывает cookie. Этот объект также содержит метод GelTransiorm, полу­чающий текущий скин из cookie.


Все WcbSk in-страницы в приложении DevHawk Books имеют расширение .xmJ. Поскольку IIS по умолчанию не передает НТТР-запросы к XML-файлам в ASP.NET, я включил простой файл сценария на VBScript, выпол­няющий соответствующую настройку. Я также включил сценарий на VB­Script, настраивающий подкаталог DevHawk Books как виртуальную Web-папку. Оба сценария выполняются при запуске файла install.bat.

Заключение

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

я заменяю встроенную поддержку Web-форм и Web-сервисов собствен­ным механизмом, обслуживающим Web-запросы по своей схеме.

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



труба стальная в ппу