Server.MapPath在本地计算机和服务器计算机中的行为是否不同?

时间:2010-07-01 05:53:38

标签: asp.net server.mappath

我与Server.MapPath()发生了真正的噩梦。当我在我的ASP.NET Development Server中运行的应用程序中调用Server.MapPath("~")时,它会返回以f:\projects\app1\之类的反斜杠结尾的根目录,但我在已发布的版本中调用它,安装在IIS中,它返回根目录,没有任何反斜杠,如c:\inetpub\wwwroot\app1。为什么会这样?怎么可以避免?

我在同一台计算机上执行了2个方案:Windows Server 2008 R2 x64,Visual Studio 2010 x64,IIS 7.

更新

为什么我关心它? Ineed我已经根据文件/文件夹结构编写了一个自定义站点地图提供程序。它提取根目录"~"的文件/文件夹列表,用Server.MapPath("~")替换根目录部分,以生成.aspx文件的URL,以便在ASP.NET Menu控件中使用。我认为以下代码解释了我在做什么:

    string mainRoot = HttpContext.Current.Server.MapPath("~");

    DirectoryInfo di = new DirectoryInfo(mainRoot); 

    //added to solve this problem with Server.MapPath
    if (!mainRoot.EndsWith(@"\"))
        mainRoot += @"\";


    FileInfo[] files = di.GetFiles("*.aspx");
    foreach (FileInfo item in files)
    {
        string path = item.FullName.Replace(mainRoot, "~/").Replace(@"\", "/");

        //do more here
    }

1 个答案:

答案 0 :(得分:6)

可能是在IIS内部设置虚拟目录时,具体取决于在设置时是否使用了斜杠。

但这真的很重要吗?为什么你甚至会关心Server.MapPath("~")返回的内容?我无法想象你会像那样使用它。更有可能的是,当你真正需要一条路径 in 你的应用程序时:

Server.MapPath("~/Something/Foo.txt");

此外,每当你建立路径时,你应该尝试养成使用Path.Combine的习惯,因为你根本不需要担心尾随斜杠:

string fullPath = Path.Combine(Server.MapPath("~"), @"Something\Foo.txt");