Pergunta

Eu tenho um caminho de URL asp.net que está sendo gerado em um formulário da web e está saindo algo como "/foo/bar/../bar/path.aspx" e está saindo no html gerado assim também .Deve ser abreviado para "/foo/bar/path.aspx".

Path.Combine não corrigiu isso.Existe uma função para limpar esse caminho?

Foi útil?

Solução

Você poderia criar uma classe auxiliar que agrupasse a classe UriBuilder em 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;
    }
}

que poderia então ser usado assim:

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

É um pouco hackeado, mas funcionaria para o exemplo específico que você deu.

EDITAR:Atualizado para refletir os comentários de Andrew.

Outras dicas

Faça o que fizer, não use um UriBuilder estático.Isso apresenta todos os tipos de condições de corrida em potencial que você pode não detectar até estar sob carga pesada.

Se dois threads diferentes chamassem UriHelper.NormalizeRelativePath ao mesmo tempo, o valor de retorno de um poderia ser passado de volta para o outro chamador arbitrariamente.

Se você quiser usar o UriBuilder para fazer isso, basta criar um novo quando precisar (não é caro criar).

A resposta do Sarcastic é muito melhor que a minha, mas se você estivesse trabalhando com caminhos de sistema de arquivos, meu hack feio abaixo também pode ser útil.(Tradução:Eu digitei, então serei amaldiçoado se não postar :)

Path.Combine apenas junta duas strings, prestando atenção às barras iniciais ou finais.Até onde eu sei, o único método Path que faz normalização é Path.GetFullPath.A seguir, você encontrará a versão "limpa".

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

Claro, há o pequeno problema de que o caminho resultante será enraizado e as barras serão convertidas em barras invertidas (como "C:\foo\bar\path.aspx").Mas se você conhece a raiz pai do caminho original, remover a raiz não deve ser um grande problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top