Это классический 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 независимо от тега включения.
Я ценю ваше внимание к моей проблеме. Если вы можете представить лучшее решение, я был бы очень рад. Спасибо!
#include
, за исключением того, что вы можете создать свой собственный HttpHandler и зарегистрировать его в IIS. См. Http-обработчик для классического приложения ASP для введения уровня между клиентом и сервером. - person user692942   schedule 29.11.2016foo
. Вам нужен доступ к нему во всем приложении? У меня есть предложение, поэтому я пытаюсь убедиться, подходит ли оно вам. - person Kul-Tigin   schedule 06.12.2016foo
не имеет значения. В этой строке запроса ничего нет, она даже не существует. Переменная больше никогда не будет использоваться. Это действительно фу. Вы можете инкапсулировать мой код вSub Workaraoud() ... End Sub
, а затем вызвать его. Что имеет значение, так это вызовRequest.QueryString("foo")
, который запускает классический механизм декодирования строки запроса ASP с использованием принудительной кодовой страницы UTF-8. - person Eduardo de Souza Cruz   schedule 07.12.2016