2

クラシックASPでは、Server.MapPath()がglobal.asa内のApplication_OnStartイベントで常に正しく機能するとは限りません。仮想ルート内の「\testfolder\ test.asp」にASPページがあり、「\ xsl\transform.xsl」にXSLTファイルがあります。私の仮想ルートは「c:\ inetpub \ wwwroot \testapp\」にあります。

ASPページ内でMapPathを使用して、XSLTファイルへのフルパスを取得します。呼び出しは次のとおりです。

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

MapPathが期待どおりに「c:\ inetpub \ wwwroot \ testapp \ xsl \ transform.xsl」を返す場合もあれば、誤って「c:\ inetpub \ wwwroot \ testapp \ testfolder \ xsl\transform.xsl」を返す場合もあります。間違ったパスは明らかに深刻な問題を引き起こします。

4

2 に答える 2

2

私はここで私自身の質問に答えています:

この問題は、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 "

Webサイトのルートフォルダにファイルしかない場合、またはglobal.asaMapPathを使用していない場合は、この小さな奇妙なことに気付くことはありません。これが原因で正しく起動できないASPClassicサイトがたくさんあるのではないかと思いますが、所有者は何がうまくいかなかったのかわからないまま、すばやくiisresetを実行します。

この結果、ルートフォルダ以外の場所にASPファイルがあるWebサイトがある場合、 global.asaMapPathを確実に使用することはできません。

1回限りのWebサイトの場合、最も簡単な解決策は、global.asaで使用するパスをハードコーディングすることです。

ASPクラシックに基づいて製品を他の人に販売する場合、パスをハードコーディングすることはできません。MapPathのすべての使用法をアプリケーションの起動から移動するか、インストーラーの一部としてASPファイルにパスを書き込むことで問題に対処する必要があります。

于 2009-01-30T18:05:29.173 に答える