Подтвердить что ты не робот

Как использовать Server.MapPath для получения местоположения за пределами папки веб-сайта в ASP.NET

Когда мой сайт ASP.NET использует документы (например, XML), я обычно загружаю документ следующим образом:

Server.MapPath("~\Documents\MyDocument.xml")

Однако, я хотел бы переместить папку "Документы" из папки веб-сайта, чтобы теперь она стала родной сестрой в папке веб-сайта. Это облегчит обслуживание документов.

Однако, переписывая код загрузки документа следующим образом:

Server.MapPath("../../Documents/MyDocument.xml")

приводит к жалобе ASP.NET, что он не может "выходить за верхний каталог".

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

Спасибо

Дэвид

4b9b3361

Ответ 1

Если вы знаете, где это относительно вашего веб-корня, вы можете использовать Server.MapPath, чтобы получить физическое местоположение вашего корня веб-сайта, а затем Path class, чтобы получить ваш путь к документу.

В грубом непроверенном коде что-то вроде:

webRootPath = Server.MapPath("~")
docPath = Path.GetFullPath(Path.Combine(rootPath, "../Documents/MyDocument.xml"))

Извините, если я получил Синтаксис неправильно, но класс Path должен быть тем, что вы после играете с реальными трассами FS, а не с путями веб-типов.

Причиной отказа вашего метода является то, что Server.MapPath занимает место на вашем веб-сервере, а тот, который вы дали, недействителен, так как он "выше" вершины корня иерархии сервера.

Ответ 2

docPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\Documents\MyDocument.xml");

AppDomain.BaseDirectory возвращает текущий каталог каталога сборки веб-приложения.

Ответ 3

Если вам необходимо разрешить путь в любом случае абсолютный или относительный (даже вне корневой папки веб-приложения), используйте это:

public static class WebExtesions
{
    public static string ResolveServerPath(this HttpContextBase context, string path) {
        bool isAbsolute = System.IO.Path.IsPathRooted(path);
        string root = context.Server.MapPath("~");
        string absolutePath = isAbsolute ? 
                                    path : 
                                    Path.GetFullPath(Path.Combine(root, path));
        return absolutePath;
    }
}

Ответ 4

Если вы хотите указать местоположение где-то в жестком диске, то его недоступно в веб-среде. Если файлы меньше по размеру и количеству, вы можете сохранить его внутри каталога и указать затем с помощью каталога ~/path до каталога.

Но в некоторых случаях мы использовали объект Request. Подробнее см. Ссылку

http://msdn.microsoft.com/en-us/library/5d5940ad.aspx