【问题标题】:Does Server.MapPath behaves differently in local machine and server machine?Server.MapPath 在本地机器和服务器机器上的行为是否不同?
【发布时间】:2010-07-01 05:53:37
【问题描述】:

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

我在同一台机器上做了 2 个场景:Windows Server 2008 R2 x64、Visual Studio 2010 x64、IIS 7。

更新:

我为什么关心它?确实,我已经编写了一个基于文件/文件夹结构的自定义站点地图提供程序。它提取根目录"~" 的文件/文件夹列表,用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
    }

【问题讨论】:

    标签: asp.net server.mappath


    【解决方案1】:

    它可能来自您在 IIS 中设置虚拟目录时,这取决于您在设置时是否使用了斜杠。

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

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

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

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

    【讨论】:

    • +1 即将提出确切的一些观点。可能来自配置,应该不重要。
    • +1 好主意!我自己应该记住这一点,尽管我从来没有遇到过任何问题。
    • 查看我的更新,了解我为什么关心它
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2021-10-12
    相关资源
    最近更新 更多