web-dev-qa-db-fra.com

Comment utiliser Server.MapPath pour obtenir un emplacement en dehors du dossier du site Web dans ASP.NET

Lorsque mon site ASP.NET utilise des documents (par exemple, XML), je le charge normalement de la manière suivante:

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

Cependant, j'aimerais déplacer le dossier Documents du dossier du site Web afin qu'il soit maintenant un frère du dossier du site Web. Cela facilitera considérablement la maintenance des documents.

Cependant, réécrivez le code de chargement du document comme suit:

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

se traduit par une plainte d'ASP.NET selon laquelle il ne peut pas "quitter au-dessus du répertoire principal".

Alors, quelqu'un peut-il suggérer comment je peux spécifier relativement l'emplacement d'un dossier en dehors du dossier du site Web? Je ne souhaite vraiment pas spécifier de chemins absolus pour des raisons évidentes de déploiement.

Merci

David

11
David

Si vous savez où il se situe par rapport à votre racine Web, vous pouvez utiliser Server.MapPath pour obtenir l'emplacement physique de votre racine Web, puis la méthode Path class pour obtenir votre chemin de document.

Dans le code brut non contrôlé, quelque chose comme:

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

Désolé si la syntaxe est incorrecte, mais la classe Path devrait correspondre à ce que vous voulez jouer avec de vrais chemins FS plutôt que les chemins de type Web.

La raison pour laquelle votre méthode a échoué est que Server.MapPath prend un emplacement sur votre serveur Web et que celui que vous avez indiqué n'est pas valide, car il se trouve "au-dessus" du haut de la racine de la hiérarchie du serveur.

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

AppDomain.BaseDirectory retourne le chemin du répertoire d'assemblage de l'application Web en cours.

5
Tadas Šukys

Si vous devez résoudre le chemin dans les deux cas, absolu ou relatif (même en dehors du dossier racine de l'application Web), utilisez ceci:

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;
    }
}
1
cleftheris

Si vous souhaitez spécifier l'emplacement quelque part dans le disque dur, il n'est pas facilement disponible dans l'environnement Web. Si la taille et la quantité des fichiers sont plus petites, vous pouvez les conserver dans le répertoire et pointer ensuite à l’aide de ~/chemin jusqu’à répertoire.

Mais dans certains cas, nous avions l'habitude de faire l'objet Request. Pour plus visitez ce lien

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

0
user240141