Domanda

Ho un asp.net url di un percorso che è generata da un modulo web, e sta venendo fuori qualcosa di simile a "/foo/bar/../bar/percorso.aspx", e che è venuta fuori nel codice html generato come questo.Dovrebbe essere ridotto a "/foo/bar/percorso.aspx".

Percorso.Combinare non risolvere il problema.C'è una funzione per pulire questo percorso?

È stato utile?

Soluzione

Si potrebbe creare una classe di supporto che avvolgeva il 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;
    }
}

che potrebbe poi essere utilizzato come questa:

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

È un po ' sporca, ma per l'esempio che hai dato.

EDIT:Aggiornato per riflettere Andrew commenti.

Altri suggerimenti

Qualunque cosa tu faccia, non usare statico UriBuilder.Questo presenta tutti i tipi di potenziali condizioni di gara che si potrebbe non rilevare fino a quando si è sotto carico pesante.

Se due thread diversi chiamati UriHelper.NormalizeRelativePath allo stesso tempo, il valore di ritorno per uno, che potrebbero essere trasferiti in altri chiamante arbitrariamente.

Se si desidera utilizzare UriBuilder per fare questo, basta crearne uno nuovo quando ne hai bisogno (non è costoso, per creare).

Sarcastica la risposta è tanto meglio della mia, ma se si sta lavorando con filesystem percorsi, il mio brutto hack qui sotto potrebbe essere utile anche.(Traduzione:Ho digitato, quindi, che io sia dannato se non riesco a postare :)

Percorso.Combinare solo schiaffi due corde insieme, facendo attenzione a leader o slash.Per quanto ne so, l'unico metodo Percorso che fa la normalizzazione è Percorso.GetFullPath.La seguente ti darà la "ripulito" versione.

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

Naturalmente, c'è il piccolo problema che il percorso risultante sarà radicata e le barre saranno convertiti back slash (come "C:\foo\bar\path.aspx").Ma se si conosce il genitore radice del percorso originale, togliendo il root non dovrebbe essere un grosso problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top