2016-11-28 18 views
2

Это классический ASP, работающий на IIS 8.5.Классический ASP: запуск кода в начале каждого запроса перед обработкой фактического файла .asp

Мне нужно запустить VBScript, который должен быть общим для всех моих * .asp страниц в начале каждого запроса Http для этих * .asp файлов.

В настоящее время я использую тег #include в верхней части каждого * .asp файла. Я ссылаюсь на файл, содержащий код, который я хочу запустить.

Это трюк, но он уродливый и опасный: если один из файлов * .asp случайно пропустил тег #include, код не будет запущен.

Есть ли способ сделать код для каждого * .asp запроса без необходимости писать код внутри каждого * .asp файла?

В ASP.NET у нас есть событие HttpApplication.BeginRequest. То, что я ищу, эквивалентно этому, но в классическом ASP. Мне нужно запустить VBScript, который может получить доступ к объектам Classic ASP в начале каждого * .asp запроса.

Редактировать: согласно запросу Kul-Tigin, это причина, по которой я хочу это сделать: Мои файлы * .asp закодированы в ANSI. Но URL-запросы поступают в UTF-8, что создает проблемы.

Если я ничего не делаю, механизм ASP расшифровывает url (и строки запроса), как если бы они были в ANSI. Например: строка запроса ?value=ç будет отправлена ​​браузером как ?value=%C3%A7. C3A7 - это байты для «ç», закодированные в UTF-8. Но движок ASP считывает 2 байта как 2 отдельных символа ANSI. Итак, если я ничего не сделаю, то Request.QueryString("value") будет строкой длиной 2, с содержанием «Ã§».

Чтобы исправить это, я создал следующий обходной путь, который работает:

Sub Workaround() 
    Response.CodePage = 65001 ' Temporarally set the Response CodePage to UTF-8. Originally it was 1252 (ANSI). 
    Dim foo 
    foo = Request.QueryString("foo") 'ASP engine uses the Response.CodePage to decode the querystring 
    Response.CodePage = 1252 ' Set the Response CodePage back to ANSI. 
End Sub 
Workaround() 

Я не забочусь о «Foo» строки запроса, он может даже не существовать. Я просто делаю это, чтобы «прикоснуться» к десериализатору ASP Query String. По-видимому, он декодирует все значения строки запроса в первый раз, когда используется во время обработки запроса. Таким образом, даже после установки CodePage на 1252, в моем предыдущем примере, если я прочитал конкретную строку запроса Request.QueryString("value"), это будет строка длиной 1, содержащая «ç», как предполагалось.

Я применил обходной код в файле workaround.inc и включил его в начале большинства моих * .asp файлов, которые решили проблему на данный момент. Но есть более тысячи * .asp файлов и еще еще предстоит разработать. Невозможно убедиться, что все они содержат workaround.inc, поэтому я хотел запустить код для всех * .asp-запросов независимо от тега include.

Я ценю вашу заботу о моей проблеме. Если бы вы могли представить лучшее решение, я был бы очень доволен. Спасибо!

+1

Существует не так много вариантов, кроме файлов '# include', кроме как можно создать собственный HttpHandler и зарегистрировать его с помощью IIS. См. [Обработчик Http для классического приложения ASP для введения слоя между клиентом и сервером] (http://softwareengineering.stackexchange.com/q/154102/131815). – Lankymart

+0

Звучит как регистратор? Это можно сделать, используя [Пользовательский HTTP-модуль] (https://msdn.microsoft.com/en-us/library/ms227673.aspx) (написанный на .NET) в пуле приложений со встроенным конвейером. Могут быть и другие способы, поэтому я должен спросить. Какие конкретные объекты ASP вы планируете получить? –

+0

@ Kul-Tigin Это не журнал. Мне нужно получить доступ к объектам ASP «Request» и «Response». Причиной этого является то, что мне нужно запустить обходной код для обработки запросов с запросами, которые закодированы в UTF-8, в то время как мои файлы * .asp находятся в ANSI. Если я ничего не делаю, классический движок asp считывает 2 байта utf-8 одиночных символов как 2 различных символа ANSI. Он читает правильно для остальной части страницы, если вначале я просто установил «Response.CodePage = 65001» (utf-8), прочитал случайную последовательность запросов, а затем вернул исходное значение «Response.CodePage». –

ответ

-1

В классическом ASP вы можете иметь global.asa файл и использовать 2 событие для применения, а также 2 для сессии (по всей заявке)

Применение (где начинается/сервер останавливается)

сессии (когда сеанс пользователя создается и завершено/выгружен)

http://www.w3schools.com/asp/asp_globalasa.asp

, а также, на одной странице, вы можете использовать onLoad и onUnload события

https://msdn.microsoft.com/en-us/library/ms952648.aspx

+0

Ни одно из событий в 'global.asa' не запускается для каждого запроса, и ссылка на' Window_OnLoad() 'просто неверна, поскольку ее код на стороне клиента не является серверным. Также факт, что вы используете w3schools как ссылку, просто наполняет меня недоверием. – Lankymart

+0

Также события «Приложения» не происходят, когда сервер останавливается и запускается, когда веб-приложение останавливается и запускается, который контролируется пулом приложений, и любое расписание рециркуляции определено. – Lankymart

+0

@ Lankymart для тех, кто занимается разработкой, * запуск/остановка сервера * означает включение/выключение пула APP ... действительно, вы собираетесь выбрать семантику сейчас? – balexandre

0

Для простоты я хотел бы использовать общий #include, которая сама по себе может #include другие файлы на основе критериев страниц.

+0

ASP не выполняет условные включения. Вы имели в виду что-то еще, «на основе критериев страницы»? – Martha

+1

Нет - но включенный код выполняется условно, это то, что я делал. –