Это классический 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.
Я ценю вашу заботу о моей проблеме. Если бы вы могли представить лучшее решение, я был бы очень доволен. Спасибо!
Существует не так много вариантов, кроме файлов '# include', кроме как можно создать собственный HttpHandler и зарегистрировать его с помощью IIS. См. [Обработчик Http для классического приложения ASP для введения слоя между клиентом и сервером] (http://softwareengineering.stackexchange.com/q/154102/131815). – Lankymart
Звучит как регистратор? Это можно сделать, используя [Пользовательский HTTP-модуль] (https://msdn.microsoft.com/en-us/library/ms227673.aspx) (написанный на .NET) в пуле приложений со встроенным конвейером. Могут быть и другие способы, поэтому я должен спросить. Какие конкретные объекты ASP вы планируете получить? –
@ Kul-Tigin Это не журнал. Мне нужно получить доступ к объектам ASP «Request» и «Response». Причиной этого является то, что мне нужно запустить обходной код для обработки запросов с запросами, которые закодированы в UTF-8, в то время как мои файлы * .asp находятся в ANSI. Если я ничего не делаю, классический движок asp считывает 2 байта utf-8 одиночных символов как 2 различных символа ANSI. Он читает правильно для остальной части страницы, если вначале я просто установил «Response.CodePage = 65001» (utf-8), прочитал случайную последовательность запросов, а затем вернул исходное значение «Response.CodePage». –