Сервер.mappath ведет себя по-разному в локальной машине и серверной машине?
-
01-10-2019 - |
Вопрос
У меня был настоящий кошмар с Server.MapPath()
. Отказ Когда я звоню Server.MapPath("~")
В моем приложении, которое работает в сервере разработки ASP.NET, он возвращает корневой каталог, который заканчивается на задней слефе, как f:\projects\app1\
, но я называю его в опубликованной версии, установленной в IIS, он возвращает Root Directory без какой-либо спины, как c:\inetpub\wwwroot\app1
. Отказ Почему это происходит? Как избежать?
Я сделал 2 сценария на одной машине: Windows Server 2008 R2 X64, Visual Studio 2010 x64, IIS 7.
ОБНОВИТЬ:
Почему я забочусь об этом? Ведом я написал пользовательский поставщик карта сайта на основе структуры файла / папки. ИТ извлекивает список файлов / папок корневого каталога "~"
, заменяет раздел Root Directory с 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
}
Решение
Это может быть, когда вы настроили виртуальный каталог внутри IIS, в зависимости от того, использовали ли вы трейлинг, при настройке его.
Но действительно ли это имеет значение? Почему вы даже заботитесь о том, что Server.MapPath("~")
возвращается? Я не могу себе представить, что вы когда-нибудь будете использовать это так. Гораздо более вероятно, когда вам действительно нужен путь к чему-то внутри ваше приложение:
Server.MapPath("~/Something/Foo.txt");
Кроме того, всякий раз, когда вы создаете пути, вы должны попытаться попасть в привычку использовать Path.combine., Потому что вам не нужно беспокоиться о том, чтобы вообще беспокоиться вообще:
string fullPath = Path.Combine(Server.MapPath("~"), @"Something\Foo.txt");