Asp.net уплотнение пути - PullRequest
       17

Asp.net уплотнение пути

2 голосов
/ 10 сентября 2008

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

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

Ответы [ 3 ]

4 голосов
/ 10 сентября 2008

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

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

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

1 голос
/ 10 сентября 2008

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

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

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

0 голосов
/ 10 сентября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...