C#의 Uri.MakeRelativeUri(Uri) 메서드는 두 개의 Uri 인스턴스를 비교하여 현재 URI를 기준으로 대상 URI의 상대 경로(relative URI)를 계산하는 데 사용됩니다. 예를 들어, 동일한 도메인 내의 두 주소가 있을 때 한쪽에서 다른 쪽으로 이동하는 상대적인 차이를 손쉽게 얻을 수 있습니다.
구문(Syntax)
MakeRelativeUri 메서드의 기본 구문은 다음과 같습니다.
public Uri MakeRelativeUri (Uri uri);
매개변수 uri는 현재 URI와 비교할 대상 URI를 의미합니다. 메서드는 두 URI 간의 상대 경로를 나타내는 새로운 Uri 객체를 반환합니다.
예제 1: 기본 사용법
다음은 Uri.MakeRelativeUri(Uri) 메서드를 실제로 구현한 첫 번째 예제입니다.
using System;
public class Demo {
public static void Main(){
Uri newURI1 = new Uri("https://www.tutorialspoint.com/");
Console.WriteLine("URI = "+newURI1);
Uri newURI2 = new Uri("https://www.tutorialspoint.com/java.htm");
Console.WriteLine("URI = "+newURI2);
if(newURI1.Equals(newURI2))
Console.WriteLine("두 URI는 서로 같습니다!");
else
Console.WriteLine("두 URI는 서로 같지 않습니다!");
Uri res = newURI1.MakeRelativeUri(newURI2);
Console.WriteLine("상대 URI = "+res);
}
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
URI = https://www.tutorialspoint.com/ URI = https://www.tutorialspoint.com/java.htm 두 URI는 서로 같지 않습니다! 상대 URI = java.htm
출력 결과를 보면 두 URI가 같지 않다고 판별된 후, MakeRelativeUri 메서드가 java.htm이라는 상대 경로를 반환한 것을 확인할 수 있습니다. 즉, 루트 주소(https://www.tutorialspoint.com/)에서 java.htm 페이지까지의 상대적 위치가 계산된 것입니다.
예제 2: 프래그먼트(#)가 포함된 URI 처리
이번에는 URI에 프래그먼트(fragment, # 뒤의 부분)가 포함된 경우의 동작을 살펴보겠습니다.
using System;
public class Demo {
public static void Main(){
Uri newURI1 = new Uri("https://www.tutorialspoint.com/");
Console.WriteLine("URI = "+newURI1);
Uri newURI2 = new Uri("https://www.tutorialspoint.com/jquery.htm#abcd");
Console.WriteLine("URI = "+newURI2);
if(newURI1.Equals(newURI2))
Console.WriteLine("두 URI는 서로 같습니다!");
else
Console.WriteLine("두 URI는 서로 같지 않습니다!");
Uri res = newURI1.MakeRelativeUri(newURI2);
Console.WriteLine("상대 URI = "+res);
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
URI = https://www.tutorialspoint.com/ URI = https://www.tutorialspoint.com/jquery.htm#abcd 두 URI는 서로 같지 않습니다! 상대 URI = jquery.htm#abcd
정리
Uri.MakeRelativeUri(Uri) 메서드는 웹 애플리케이션에서 링크를 생성하거나 리소스 경로를 동적으로 계산할 때 매우 유용합니다. 두 번째 예제에서 볼 수 있듯이, 대상 URI에 프래그먼트(#abcd)가 포함되어 있어도 해당 부분까지 포함하여 정확한 상대 경로를 반환한다는 점도 기억해 두면 좋습니다. 단, 두 URI의 스킴(scheme)이나 호스트가 다른 경우에는 절대 URI가 반환될 수 있다는 점에 유의해야 합니다.