ExecuteGlobal в VBScript, ASP в IIS 5.1 (Win XP Pro) не работает

Какой параметр может отсутствовать или применяться неправильно, что приведет к сбою того же кода, который работает на сервере IIS 6.0, на сервере IIS 5.1?

Я унаследовал это большое классическое приложение ASP. Он «кэширует» серию файлов с функциями в них с помощью команды ExecuteGlobal. На обоих серверах команда выполняется без ошибок. Однако, когда приложение позже пытается ссылаться на функции, которые были «кэшированы», IIS 6.0, кажется, работает нормально, в то время как IIS 5.1 действует так, как будто этих функций никогда не существовало, и я получаю сообщения об ошибках.

Система 5.1 предназначена для тестирования на приставке XP Pro. 6.0 - это наша производственная система на Windows 2003.

Потребовалось много времени, чтобы изолировать проблему (идентичный код не прошел тест, но работал в производственной среде) в этом коде. К сожалению, установка другого сервера невозможна (бюджетные ограничения - нет денег на оплату службы поддержки или на аренду помещения, где все серверы должны быть физически расположены - военная установка).

Какие направления я пропустил?


person David    schedule 30.10.2009    source источник


Ответы (2)


Происходит ли «кеширование» и «использование кэшированных функций» при обработке одного и того же HTTP-запроса?

Если ответ «да», то у меня нет идей, и я искренне надеюсь, что кто-то еще ответит на ваш вопрос.

Если ответ отрицательный, то я почти уверен, что ваша проблема в том, что вы «кешируете» функцию в другом контексте выполнения VBScript.

Попробуйте (на тестовом сервере, конечно :-) добавить следующие 2 строки в файл, определяющий функции:

Dim g_FunctionsLoadedOK
g_FunctionsLoadedOK = "OK"

и следующую строку непосредственно перед использованием функции:

if( Eval( "VarType(g_FunctionsLoadedOK)" ) <> vbString then
    ' Then you're sure there's no 'g_FunctionsLoadedOK' string variable defined in this VBScript execution context,
    ' so maybe you should reload the cached functions, or do something else..
end if

P.S. Если система, с которой вы имеете дело, действительно большая, почему бы не использовать ‹! - #include file =" MyFile.inc "-› вместо этого подхода "ExecuteGlobal"?

person Soonts    schedule 30.10.2009
comment
Спасибо за предложение. Методология включения - это то, что они использовали до тех пор, пока страница не стала огромной, поэтому включения были заменены включением процедуры, которая должна была имитировать функциональность PHP require_once. - person David; 01.11.2009
comment
Это вам не поможет, но замена серверных включений на executeglobe кажется мне плохой идеей. Вы не только потеряете всю отладочную информацию, но и производительность также сильно пострадает. Файлы ASP компилируются в байт-код и затем сохраняются в кеше. Наличие большого приложения с большим количеством включений не замедляет работу приложения. Мы запускаем огромное приложение из одного-единственного asp-файла (используя urlrewriting) с большим количеством включений, и оно работает как шарм. Однако Execute, executeglobal и eval работают очень медленно из-за необходимости компилировать строку в байт-код при каждом вызове. - person Joost Moesker; 02.11.2009
comment
Я бы хотел отправить поддельный код require_once в корзину. Я думаю, что оригинальный программист сделал это только потому, что ему понравилось это на PHP. Для меня становится все более очевидным, что мне нужно будет найти решение, исключающее часть ExecuteGlobal. - person David; 02.11.2009

Можете ли вы опубликовать код для поддельного материала ExecuteGlobal, возможно, его можно будет реорганизовать, чтобы заставить его делать то, что вы хотите, с помощью Includes, чтобы вам не пришлось ничего ломать. В противном случае может потребоваться немного поиска и замены :)

person Pete Duncanson    schedule 02.11.2009
comment
Оказывается, все не так, как кажется. Хотя из-за ошибки, которую я получил, это выглядело так, как будто кешированная функция не была определена, добавление некоторого отладочного кода ранее в части страницы VBScript (ошибка происходит в Javascript) показало, что функция действительно была определена и «запомнена». Я действительно начал пытаться заменить материал 'require_once' на INCLUDE, но у него есть другие проблемы из-за разницы в средах. Но я получил отсрочку. Мой босс говорит начальству, что нам нужна настоящая тестовая среда, и мы не можем продолжать ее. - person David; 03.11.2009