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"

如果您的网站只有根文件夹中的文件,或者在global.asa中不使用MapPath ,那么您将永远不会注意到这个小怪异。我怀疑有很多 ASP Classic 站点有时因此无法正常启动,但它们的所有者只是快速进行了 iisreset,不知道出了什么问题。

这样做的结果是,如果您的网站在除根文件夹之外的任何位置都有 ASP 文件,那么您就无法在global.asa中可靠地使用MapPath 。

如果它是一次性网站,那么最简单的解决方案就是硬编码您在global.asa中使用的任何路径。

如果您基于 ASP Classic 向其他人销售产品,那么硬编码路径不是一种选择。您要么必须将MapPath的所有使用移出应用程序启动,要么通过将路径写入 ASP 文件作为安装程序的一部分来处理该问题。

于 2009-01-30T18:05:29.173 回答
0

或者使用 sXslPath = Server.MapPath("\xsl\transform.xsl")

然后将从根目录映射路径

自然,如果您在非服务器操作系统中的 iis 上进行开发,root 将是默认网站,您必须记住在部署时进行更改...

于 2009-08-28T16:11:28.133 回答