Влияет ли Server.MapPath по-разному на локальном компьютере и на сервере? - PullRequest
4 голосов
/ 01 июля 2010

У меня был настоящий кошмар с Server.MapPath(). Когда я вызываю Server.MapPath("~") в моем приложении, работающем на ASP.NET Development Server, он возвращает корневой каталог, который заканчивается обратной косой чертой, как f:\projects\app1\, но я вызываю его в опубликованной версии, установленной в IIS, он возвращает корневой каталог без любая обратная косая черта, как c:\inetpub\wwwroot\app1. Почему это происходит? Как можно избежать?

Я выполнил 2 сценария на одной машине: Windows Server 2008 R2 x64, Visual Studio 2010 x64, IIS 7.

UPDATE:

Почему я забочусь об этом? Ineed Я написал собственный поставщик карты сайта, основанный на структуре файлов / папок. Он извлекает список файлов / папок корневого каталога "~", заменяет раздел корневого каталога на Server.MapPath("~"), чтобы создать URL-адрес файлов .aspx для использования в элементе управления 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 Ответ

6 голосов
/ 01 июля 2010

Это может быть из-за того, что вы настраивали виртуальный каталог внутри IIS, в зависимости от того, использовали ли вы конечный слеш при его настройке.

Но действительно ли это имеет значение?Зачем тебе все равно, что Server.MapPath("~") возвращает?Я не могу представить, что ты когда-нибудь будешь использовать это просто так.Гораздо вероятнее, когда вам действительно нужен путь к чему-то внутри вашего приложения:

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

Кроме того, всякий раз, когда вы создаете пути, вы должны попытаться привыкнуть Path.Combine , потому что вам не нужно беспокоиться о конечных слешах:

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