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
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.
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.
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;
}
}
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