Server.MapPath для возврата двух папок из корня - PullRequest
7 голосов
/ 15 марта 2012

Вот как я это делаю:

HttpContext.Current.Server.MapPath(@"~\~\~\Content\")

Я знаю, что "." это для рута проекта, но как вернуться на несколько папок назад?

Ответы [ 4 ]

13 голосов
/ 15 марта 2012

Если вам действительно нужен путь деда, вы можете получить его из корневого пути, используя Path.GetDirectoryName():

string root = Server.MapPath("~");
string parent = Path.GetDirectoryName(root);
string grandParent = Path.GetDirectoryName(parent);

Но ваше веб-приложение, скорее всего, не будет иметь разрешениячитать или писать там - я не уверен, что ты собираешься делать с этим.

4 голосов
/ 15 марта 2012

Начните с корня вашего сайта с ~ и укажите полный путь: ~/Archive/Content.

Вы не можете вернуться выше корня сайта из-за ограничений безопасности, см. Также эту статью из других решений.

IIS целенаправленно предотвращает подачу контента непосредственно за пределы пути сайта. Однако вы можете создать виртуальный каталог в IIS и указать на это ISAPI Rewrite. Например, создайте виртуальный каталог с именем / staticfiles, который указывает на c: \ test \ data \ static-files. Что касается IIS, то это прямо из корня сайта в папке /staticfiles.

3 голосов
/ 07 марта 2014

Вы можете использовать Parent.Parent.FullName

  string grandParent  = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/")).Parent.Parent.FullName;
0 голосов
/ 07 сентября 2016

Поскольку вы используете MapPath, вам возвращается физический путь (\) из виртуального пути (/).

Создание объекта DirectoryInfo или использование служебного метода Path, начиная с корня дочернего приложения, не обязательно даст вам то, что вы ожидаете, если ваш виртуальный родитель и виртуальный дедушка не имеют ту же иерархию, что и ваша структура физического каталога.

Мои приложения физически не вложены в соответствии с глубиной URL. Это также может иметь место, если задействован виртуальный каталог.

Если предположить, что приложение для прародителя состоит из двух виртуальных папок, это даст вам физический путь

    string physicalGrandparentPath = HttpContext.Current.Server.MapPath("~/../../");

Использование этой функции защитит вас от любых игр в случайном порядке с виртуальными каталогами, происходящих в настройках IIS.

Я использовал это, чтобы увидеть, как далеко я смогу подняться. Я не получил HttpException, пока не попытался перейти выше wwwroot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...