#c# #asp.net #asp.net-mvc-3 #iis #server.mappath
#c# #asp.net #asp.net-mvc-3 #iis #server.mappath
Вопрос:
У меня есть код
string xsltPath = System.Web.HttpContext.Current.Server.MapPath(@"App_Data") "\" TransformFileName
Он возвращает
C:inetpubwwwrootwebsiteNameSERVICENAMEApp_DataFileName.xsl
Почему я получаю путь к ServiceController, SERVICENAME
? Мне нужен путь к App_Data, который находится в
C:inetpubwwwrootwebsiteNameApp_DataFileName.xsl
Ответ №1:
Вам нужно указать, что вы хотите начать с виртуального корня:
string xsltPath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath(@"~/App_Data"), TransformFileName);
Кроме того, его лучше использовать Path.Combine
для объединения путей, а не для объединения строк. Path.Combine
убедитесь, что вы не окажетесь в ситуации с разделителями двойного пути.
Редактировать:
Можете ли вы определить «абсолютные» и «относительные» пути и как они сравниваются с «физическими» и «виртуальными» путями?
В MSDN есть хорошее объяснение относительных, физических и виртуальных путей. Взгляните туда.
Комментарии:
1. Это работает. Я читал статью о «виртуальном корне», но я не очень хорошо ее понял. dotnetperls.com/mappath Можете ли вы определить «абсолютные» и «относительные» пути и как они сравниваются с «физическими» и «виртуальными» путями?
2. @П.Брайан. Mackey: абсолютный означает путь от корня, например «/someTopDirectory/someSubDirectory». Относительный означает путь от того места, где вы находитесь в данный момент, поэтому, если вы находитесь в «someSubDirectory» и хотите перейти к «someTopDirectory», относительный путь — «..» (перейдите на один каталог). Физические пути — это пути, которые видит система: «C:inetpubmyAppsomeTopDirectorysomeSubDirectory «. Виртуальные пути выглядят так, как их видит приложение веб-сервера: «/someTopDirectory/someSubDirectory».
3. @П.Брайан. Макки: Чтобы прояснить вашу ситуацию, MapPath преобразует виртуальный путь в физический путь. В вашем параметре для виртуального пути вы хотите указать абсолютный путь вместо относительного. Маркером, указывающим «корень» для абсолютного пути в веб-приложении, является «~», поэтому абсолютный виртуальный корень = «~/».
Ответ №2:
Ответы, приведенные до сих пор, — это то, что вы ищете, но я думаю, что в вашем конкретном случае вам действительно нужно это:
AppDomain.CurrentDomain.GetData("DataDirectory").ToString()
Это все равно вернет путь к файлу в каталог App_Data, если имя этого каталога изменится в будущих версиях MVC или ASP.NET .
Комментарии:
1. Я не думаю, что это особенно хорошая идея. Вы полагаетесь на недокументированный (официально) параметр AppDomain, это деталь реализации. Это гораздо более вероятно, изменится, чем
App_Data
.2. Это задокументировано и стандартно, но для ADO.Net , не ASP.Net в частности.
DataDirectory
не изменится, но может не всегда указывать наApp_Data
.
Ответ №3:
Попробуйте сделать так (@"~/App_Data")
. ~/
представляет корневой каталог.