Вопрос

У меня есть URL-адрес asp.net, который генерируется в веб-форме и выглядит примерно так: "/foo/bar/../bar/path.aspx", а в сгенерированном HTML-коде он тоже появляется. .Его следует сократить до «/foo/bar/path.aspx».

Path.Combine не исправил это.Есть ли функция очистки этого пути?

Это было полезно?

Решение

Вы можете создать вспомогательный класс, который обернет класс UriBuilder в 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;
    }
}

который затем можно было бы использовать следующим образом:

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

Это немного хакерски, но подойдет для конкретного примера, который вы привели.

РЕДАКТИРОВАТЬ:Обновлено с учетом комментариев Эндрю.

Другие советы

Что бы вы ни делали, не используйте статический UriBuilder.Это приводит к появлению всевозможных потенциальных состояний гонки, которые вы можете не обнаружить, пока не окажетесь под большой нагрузкой.

Если два разных потока вызывают UriHelper.NormalizeRelativePath одновременно, возвращаемое значение для одного может быть передано обратно другому вызывающему объекту произвольно.

Если вы хотите использовать для этого UriBuilder, просто создайте новый, когда он вам понадобится (это не дорого).

Ответ Саркастика намного лучше моего, но если вы работали с путями файловой системы, мой ответ ужасный хак ниже тоже может оказаться полезным.(Перевод:Я это напечатал, так что будь я проклят, если не опубликую :)

Path.Combine просто соединяет две строки вместе, обращая внимание на ведущие и конечные косые черты.Насколько мне известно, единственный метод Path, который выполняет нормализацию, — это Path.GetFullPath.Следующее даст вам «очищенную» версию.

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

Конечно, существует небольшая проблема: полученный путь будет корневым, а косые черты будут преобразованы в обратные (например, «C:\foo\bar\path.aspx»).Но если вы знаете родительский корень исходного пути, удаление корня не должно стать большой проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top