Классический ASP Server.MapPath () не работает должным образом в global.asa - PullRequest
2 голосов
/ 30 января 2009

В Classic ASP Server.MapPath () не всегда работает правильно в событии Application_OnStart в global.asa . У меня есть страница ASP по адресу "\ testfolder \ test.asp" в виртуальном корне, у меня есть XSLT-файл по адресу "\ xsl \ transform.xsl" . Мой виртуальный корень находится в "c: \ inetpub \ wwwroot \ testapp \" .

Я использую MapPath на странице ASP, чтобы получить полный путь к файлу XSLT. Вызов:

sXslPath = Server.MapPath("xsl\transform.xsl")

Иногда MapPath возвращает "c: \ inetpub \ wwwroot \ testapp \ xsl \ transform.xsl" , как и ожидалось, в других случаях некорректно возвращает "c: \ inetpub \ wwwroot \ testapp \ testfolder \ XSL \ transform.xsl ". Неправильный путь, очевидно, вызывает серьезные проблемы.

Ответы [ 2 ]

2 голосов
/ 30 января 2009

Я отвечаю на свой вопрос здесь:

Эта проблема возникает из-за того, что при вызове в Application_OnStart , MapPath неправильно включается контекст страницы, вызвавший запуск приложения. Если первая ASP-страница, запускаемая, когда приложение еще не запущено, находится не в корне виртуального корня, то MapPath запутывается и добавляет путь к вызываемой ASP-странице к пути, который она возвращает.

Так, например, если страница, запустившая приложение, находилась в "c: \ inetpub \ wwwroot \ testapp \ folder1 \ folder2 \ test.asp" , тогда MapPath неправильно добавит "\ folder1 \ folder2 " в середину пути и возврат " c: \ inetpub \ wwwroot \ testapp \ folder1 \ folder2 \ xsl \ transform.xsl "

Если на вашем сайте есть файлы только в корневой папке или вы не используете MapPath в global.asa , вы никогда не заметите эту маленькую странность. Я подозреваю, что есть много сайтов ASP Classic, которые иногда не запускаются должным образом из-за этого, но их владельцы просто быстро меняют настройки, не зная, что именно пошло не так.

Результатом этого является то, что вы не можете надежно использовать MapPath в global.asa , если у вас есть веб-сайт с файлами ASP где-либо, кроме корневой папки.

Если это одноразовый сайт, то самое простое решение - просто жестко закодировать любые пути, которые вы используете в global.asa .

Если вы продаете продукт другим людям на основе ASP Classic, то жесткое кодирование путей не подходит. Вы должны либо полностью исключить использование MapPath из запуска приложения, либо решить проблему, записав пути в файлы ASP в рамках программы установки.

0 голосов
/ 28 августа 2009

альтернативное использование sXslPath = Server.MapPath ("\ xsl \ transform.xsl")

, который затем сопоставит путь из корневого каталога

естественно, если вы разрабатываете на iis в ОС, которая не является сервером, root будет веб-сайтом по умолчанию, вам придется помнить об изменении при развертывании ...

...