Использование сервера.MapPath в MVC3

#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") . ~/ представляет корневой каталог.