문제

웹 양식에서 생성되는 asp.net URL 경로가 있고 "/foo/bar/../bar/path.aspx"와 같은 내용이 나오고 이와 같이 생성된 HTML에서도 나옵니다. ."/foo/bar/path.aspx"로 줄여야 합니다.

Path.Combine이 문제를 해결하지 못했습니다.이 경로를 정리하는 기능이 있습니까?

도움이 되었습니까?

해결책

System.Net에서 UriBuilder 클래스를 래핑하는 도우미 클래스를 만들 수 있습니다.

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));

약간 해키지만 제공한 특정 예에서는 작동합니다.

편집하다:Andrew의 의견을 반영하여 업데이트되었습니다.

다른 팁

무엇을 하든 정적 UriBuilder를 사용하지 마세요.이로 인해 과부하가 걸릴 때까지 감지할 수 없는 모든 종류의 잠재적인 경쟁 조건이 발생합니다.

두 개의 서로 다른 스레드가 동시에 UriHelper.NormalizeRelativePath를 호출하는 경우 하나의 반환 값이 다른 호출자에게 임의로 다시 전달될 수 있습니다.

UriBuilder를 사용하여 이 작업을 수행하려면 필요할 때 새로 생성하면 됩니다(생성 비용이 많이 들지 않음).

Sarcastic의 답변은 저보다 훨씬 낫습니다. 하지만 파일 시스템 경로로 작업하는 경우에는 아래의 추악한 해킹 유용할 수도 있습니다.(번역:제가 직접 쓴 글이라 안 올리면 낭패입니다 :)

Path.Combine은 선행 또는 후행 슬래시에 주의하면서 두 문자열을 함께 칩니다.내가 아는 한 정규화를 수행하는 유일한 Path 메서드는 Path.GetFullPath입니다.다음은 "정리된" 버전을 제공합니다.

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

물론, 결과 경로가 루팅되고 슬래시가 백슬래시로 변환된다는 작은 문제가 있습니다(예: "C:\foo\bar\path.aspx").그러나 원래 경로의 상위 루트를 알고 있다면 루트를 제거하는 것은 큰 문제가 되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top