том 2 альманах програ иста Тематический сборник материалов Library и Magazine ASP.NET Web-сервис Web-приложения альманах программиста Составитель Ю. Е. ...
-- [ Страница 3 ] --Рис. 2. IIS Как IIS обрабатывает пути без расширения (вроде report)? Он проверяет, соответствует ли виртуальный путь существующе му физическому каталогу. Если да, IIS просматривает список документов по умолчанию и ищет совпадение с именем из этого списка. Если совпа дение найдено, клиент перенаправляется на соответствующий ресурс, как я уже рассказывал. В ином случае просто возвращается сообщение об ошибке HTTP 404 File not (файл не На самом деле IIS переправляет не все вызовы, а только те из них, в которых URL не за канчивается слэшем (/) или не указывает на файл. Кроме того, отсутствие в каталоге до кумента по умолчанию не вызывает ошибку 404. В этом случае чаще всего сообщается об отсутствии у вас прав на доступ к данному Ч Прим.
Microsoft Теперь, вооружившись этими знаниями, возвращается к бизнес-аналитику и объясняет ей, что вместо в проекте надо использовать расширение файлов наподобие payroll.
Если бизнес-аналитик принимает это решение, разработчик может задей ствовать интерфейс из ASP.NET. Объекты, реализующие этот способны напрямую обрабатывать HTTP-запросы. Web форма фактически компилируется в класс, производный от класса отде ленного кода (code-behind>
Самый важный метод в IHttpHandler Ч Он принимает аргумент типа HttpContext. Этот аргумент предоставляет доступ ко всем полезным объектам вроде Request, Response и т. д. Мне нужно, чтобы HTTP-обработчик разбирал (parse) виртуальный путь и перенап равлял запрос на другую страницу. Я предпочитаю реализовать перенап равление на серверной стороне, чтобы не требовать лишнего ответа от кли ента. Для перенаправления я метод эквивалент ный тому, который поддерживается в ASP.
Единственное, на что еще я хотел бы обратить ваше внимание: как класс HttpHandler сообщает форме ASP.NET название компании.
извлекает это название из виртуального пути URL. В данном случае я ис пользовал набор (collection) (Страница ASP.NET мо жет получать название компании через выражение <%=Context.Items Код, реализующий обработчик перенаправления, пока зан на рис. 3.
Рис. 3. Обработчик using using public fiedirectionHttpHandler :
{ public * путь // на и см. след. стр.
мониторинг и Рис. 3. Обработчик перенаправления * - 1);
* Дstring 1, - // Разбить =, * Server. + Т > public get } } Реализовав класс и упаковав его в сборку, вы должны настроить Web-сайт на запуск этого обработчика при каждом запросе. Настройка понадобится в двух местах. Во-первых, в файл надо добавить кото рая сопоставляет с вашим обработчиком все содержащие расшире ние Вот как это сделал я:
Это делается либо программно, либо через пользовательский интерфейс IIS (рис. 4). DLL исполняющей среды ASP.NET, находит ся в каталоге вида Конкретный каталог для этой DLL зависит от версии Framework, поэтому самый безопасный способ найти нужную DLL Ч посмотреть, ка кая DLL сопоставлена с ASPX-файлами. Надеюсь, что в следующих вер сиях IIS, которые будут полнее поддерживать такой поиск не потре буется.
0 to:
Рис. 4. Сопоставление расширения Подробнее о реализации и настройке HTTP-обработчика см. по ссылке Перезапись URL с помощью Если вы дочитали до этого места, значит, вас скорее всего интересует уни версальное решение, которое позволило бы сопоставлять любой с ASP- или ASPX-файлами без рассмотренных ранее ограничений. Един ственный известный мне способ заключается в отказе от Framework и возврате к добрым старым Дело в том, что Ч это HTTP-обработчики, родные для IIS, и они выполняются на очень ранней стадии запросов (до кода ASP.NET).
С концептуальной точки зрения, очень похожи на HTTP в ASP.NET. Главное их отличие в том, что ISAPI-фильтры следует писать на С или C++. По ISAPI-фильтрам есть масса литературы, и я лишь кратко поясню, что они собой представляют (более подробную информа цию см. на и www.microsoft.com/mind/0797/isapitips.htm).
Перехват, и На практике Ч это Windows DLL, которая предоставляет две точки входа:
DWORD HttpFllterProc( DWORD BOOL WINAPI GetFilterVersion( Исполняющая среда IIS вызывает функцию Get Filter Version при инициа лизации фильтра. Через эту функцию фильтр должен сообщить IIS об интересующих его событиях. Потом, когда будут поступать HTTP-запро сы, IIS будет вызывать по одному разу для каждого собы тия, на уведомление о котором зарегистрировался данный фильтр. Чтобы слегка упростить эту задачу, вы можете использовать MFC-класс Ч удобную оболочку голого С API. Данный класс переправляет со бытия одному или нескольким реализованным вами виртуальным мето дам. Далее я исхожу из того, что вы работаете с такой MFC-оболочкой (см.
также который перезаписывает URL и сохраняет часть виртуального пути в псевдозаголовке, представлен на рис. 5. Для перезаписи URL нуж но перехватывать событие Весь фокус в использовании специального URL для чтения исходного. После того как URL перезапи сан, вы можете с помощью SetHeader установить специальный URL и тем самым заставить IIS вызвать ваш файл. Код на изменяет URL вида на Обратите вни мание на то, как удаляется название компании и добавляется суффикс.aspx.
Кошмарно выглядящая часть кода отвечает за извлечение названия компа нии и сведение воедино остальной части URL для выполнения запроса.
Рис. 5. Решение на основе * 409В;
char * DWORD pfc, // URL, используя специальный * см. след. стр.
Рис. 5. Решение на основе if "url", // Фильтр только к каталогу bestpayroll if cPrefix, urlSize * urlSize;
char pPage;
страницы в обратном char* - 1;
// * pPage;
// сразу за / while // за // Поиск обратном - pPage);
pCompany] "url", Остается последнее: как ASP.NET исходный URL или на звание компании. Очевидного способа взаимодействия между ISAPI и ASP или не существует. Я могу лишь добавить но вый заголовок Ч Этот заголовок можно считывать из ASP.NET через набор Request. Variables: