Question

J'ai un asp.net chemin d'accès d'url qui est généré dans un formulaire web, et sort quelque chose comme "/foo/bar/../bar/chemin d'accès.aspx", et sort dans le code html généré comme cela aussi.Il devrait être réduit à "/foo/bar/chemin d'accès.aspx".

Chemin d'accès.Combiner n'ont pas le fixer.Est-il une fonction pour nettoyer ce chemin?

Était-ce utile?

La solution

Vous pouvez créer une classe helper qui a enveloppé le UriBuilder classe System.Net

public static class UriHelper
{       
    public static string NormalizeRelativePath(string path)
    {
        UriBuilder _builder = new UriBuilder("http://localhost");
        builder.Path = path;
        return builder.Uri.AbsolutePath;
    }
}

qui pourrait alors être utilisée comme ceci:

string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));

Il est très orthodoxe, mais il serait travailler pour l'exemple que vous avez donné.

EDIT:Mis à jour pour refléter Andrew commentaires.

Autres conseils

Quoi que vous fassiez, ne pas utiliser de statique UriBuilder.Cela introduit toutes sortes de conditions de course que vous pourriez ne pas détecter jusqu'à ce que vous êtes sous une lourde charge.

Si deux threads différents appelée UriHelper.NormalizeRelativePath dans le même temps, la valeur de retour de l'un pourrait être transmis à l'interlocuteur de manière arbitraire.

Si vous souhaitez utiliser UriBuilder pour ce faire, il suffit de créer un nouveau lorsque vous en avez besoin (c'est pas cher pour créer).

Sarcastique réponse est tellement mieux que la mienne, mais si vous travaillez avec le système de fichiers chemins, mon laide hack ci-dessous pourrait être utile aussi.(Traduction:J'ai tapé à la machine, de sorte que je sois damné si je ne poste pas :)

Chemin d'accès.Combiner gifle juste deux cordes en même temps, prêter attention à la tête ou à la fuite des barres obliques.Autant que je sache, le seul Chemin méthode qui ne la normalisation est le Chemin.GetFullPath.Le tableau suivant vous donne les "nettoyé" version.

myPath = System.IO.Path.GetFullPath(myPath);

Bien sûr, il y a la petite question que le chemin va être enraciné et les barres obliques seront convertis en des barres obliques inverses (comme "C:\foo\bar\path.aspx").Mais si vous savez le parent de la racine du chemin d'origine, le décapage de la racine ne doit pas être un gros problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top