65.9K
CodeProject 正在变化。 阅读更多。
Home

Global.asa 中 Server.MapPath 问题

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2005年3月7日

2分钟阅读

viewsIcon

50419

Server.MapPath 不会返回 global.asa 的物理路径。

引言

问题所在

Server.MapPath 不会返回 global.asa 的物理路径,而是返回应用程序的第一个页面加载的环境的路径。例如

给定以下目录结构:

c:\inetpub\wwwroot\global.asa
c:\inetpub\wwwroot\globaltable.txt
c:\inetpub\wwwroot\default.asp
c:\inetpub\wwwroot\anotherdir\anotherpage.asp

以及一个包含如下代码的 global.asa

<object id="GlobalTable" progid="IISSample.LookupTable" runat="Server" 
scope="Application"></object>
<script language="VBScript" runat="Server">

Sub Application_OnStart()
GlobalTable.LoadValues Server.MapPath("globaltable.txt"), 0
...

Server.MapPathglobal.asa 中将返回 “c:\inetpub\wwwroot\globaltable.txt” 或 “c:\inetpub\wwwroot\anotherdir\globaltable.txt”,具体取决于哪个页面首先加载,“\default.asp” 或 “anotherdir\anotherpage.asp”。

至少有三种情况可能发生这种情况:

  1. 用户直接访问 http://www.yourcompany.com/anotherdir/anotherpage.asp,例如通过将页面保存到收藏夹或在地址栏中输入地址。
  2. 用户在会话超时后点击了一个链接。
  3. 应用程序通过 IIS 重启或更改 global.asa 而被重启。

解决方案

实际上,没有一个通用的解决方案(至少我目前想不到),因为这完全取决于每个特定环境的其他因素。因此,我将根据我能想到的几种场景列出一些解决方案。

最简单的方法 - 你知道你的表格所在的相对虚拟路径,并且这个路径不会改变。例如,上述场景可以通过在文本文件名前面加上一个“\”,将其视为一个完整的虚拟路径来解决。

但是,在某些情况下你可能不知道这些信息,例如你的应用程序在同一台机器上的两个不同环境中运行,或者你编写将在你无法控制的其他环境中运行的模板,那么你将不得不采取一些其他创造性的方法来修复路径,例如:

Sub Application_OnStart()
    Dim path, correctedPath    path = Server.MapPath( "." )
    correctedPath = path
    If UCase(Right( path, 11 )) = "\anotherdir" Then
       correctedPath = Left( path, Len( path ) - 11 )
End if
GlobalTable.LoadValues correctedPath & "\globaltable.txt", 0

希望这能帮助你消除一些“为什么我的表格没有加载”的疑问。

Felilpe Polo-Wood

© . All rights reserved.