Классический ASP: запускайте некоторый код в начале каждого запроса перед обработкой фактического файла .asp.

Это классический ASP, работающий на IIS 8.5.

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

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

Это помогает, но уродливо и опасно: если в одном из файлов *.asp отсутствует тег #include, код не запустится.

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

В ASP.NET у нас есть событие HttpApplication.BeginRequest. То, что я ищу, это что-то эквивалентное этому, но в классическом ASP. Мне нужно запустить некоторый VBScript, который может получить доступ к классическим объектам 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 независимо от тега включения.

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


person Eduardo de Souza Cruz    schedule 28.11.2016    source источник
comment
Существует не так много вариантов, кроме файлов #include, за исключением того, что вы можете создать свой собственный HttpHandler и зарегистрировать его в IIS. См. Http-обработчик для классического приложения ASP для введения уровня между клиентом и сервером.   -  person user692942    schedule 29.11.2016
comment
Похоже на регистратор? Это можно сделать с помощью настраиваемого HTTP-модуля (написанного на . NET) в пуле приложений со встроенным конвейером. Могут быть и другие способы, поэтому я должен спросить. К каким конкретным объектам ASP вы планируете получить доступ?   -  person Kul-Tigin    schedule 29.11.2016
comment
@ Кул-Тигин Это не регистратор. Мне нужно получить доступ к объектам ASP «Запрос» и «Ответ». Причина этого в том, что мне нужно запустить обходной код для обработки запросов со строками запросов, закодированными в UTF-8, в то время как мои файлы *.asp находятся в ANSI. Если я ничего не делаю, классический движок asp читает 2-байтовые одиночные символы utf-8 как 2 разных символа ANSI. Он правильно читается для остальной части страницы, если в начале я просто устанавливаю «Response.CodePage = 65001» (utf-8), читаю случайную строку запроса, а затем возвращаю исходное значение «Response.CodePage».   -  person Eduardo de Souza Cruz    schedule 29.11.2016
comment
Я понял концепцию строки запроса и кодовой страницы. Не могли бы вы привести пример обходного пути, который вы хотите использовать с каждым запросом, я имею в виду код ASP? Вы можете обновить вопрос. Я верю, что мы сможем найти способ сделать это.   -  person Kul-Tigin    schedule 30.11.2016
comment
@Kul-Tigin Спасибо за вашу помощь, я обновил вопрос.   -  person Eduardo de Souza Cruz    schedule 01.12.2016
comment
Извини за поздний ответ. И последний вопрос. Какова область действия foo. Вам нужен доступ к нему во всем приложении? У меня есть предложение, поэтому я пытаюсь убедиться, подходит ли оно вам.   -  person Kul-Tigin    schedule 06.12.2016
comment
@Kul-Tigin Привет, еще раз спасибо! Объем foo не имеет значения. В этой строке запроса ничего нет, она даже не существует. Переменная больше никогда не будет использоваться. Это действительно фу. Вы можете инкапсулировать мой код в Sub Workaraoud() ... End Sub, а затем вызвать его. Что имеет значение, так это вызов Request.QueryString("foo"), который запускает классический механизм декодирования строки запроса ASP с использованием принудительной кодовой страницы UTF-8.   -  person Eduardo de Souza Cruz    schedule 07.12.2016


Ответы (2)


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

person Brian T    schedule 29.11.2016
comment
ASP не выполняет условное включение. Вы имели в виду что-то еще, основываясь на критериях страницы? - person Martha; 29.11.2016
comment
Нет, но включенный код выполняется условно, это я и имел в виду. - person Brian T; 04.12.2016

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

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

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

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

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

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

person balexandre    schedule 28.11.2016
comment
Ни одно из событий в global.asa не будет запускаться для каждого запроса, а ссылка на Window_OnLoad() просто неверна, поскольку его код на стороне клиента, а не на стороне сервера. Кроме того, тот факт, что вы используете w3schools в качестве эталона, просто наполняет меня недоверием. - person user692942; 29.11.2016
comment
Кроме того, Application события не происходят, когда сервер останавливается и запускается, это когда останавливается и запускается веб-приложение, которое контролируется пулом приложений и любым определенным расписанием повторного использования. - person user692942; 29.11.2016
comment
@Lankymart для тех, кто занимается разработкой, запуск/остановка сервера означает включение/выключение пула приложений ... действительно, теперь вы собираетесь выбирать семантику? - person balexandre; 30.11.2016
comment
Это действительно так? Это немного натянуто, если честно. Может быть, я знаю, что то, что вы имеете в виду, не означает, что другие, кто столкнется с этим ответом, будут. Однако моя главная проблема с этим ответом - смешанные сообщения об использовании событий клиента/сервера. - person user692942; 30.11.2016