[C#] URL에 대한 Path.Combine?

Path.Combine 은 편리하지만 URL 의 .NET 프레임 워크에 비슷한 기능이 있습니까?

다음과 같은 구문을 찾고 있습니다.

Url.Combine("http://MyUrl.com/", "/Images/Image.jpg")

이것은 다음을 반환합니다 :

"http://MyUrl.com/Images/Image.jpg"



답변

위의 토드 미니 어의 주석입니다 것을 Flurl가 포함이 Url.Combine.

자세한 내용은:

Url.Combine은 기본적으로 URL에 대한 Path.Combine으로, 파트 사이에 단 하나의 구분 문자를 보장합니다.

var url = Url.Combine(
    "http://MyUrl.com/",
    "/too/", "/many/", "/slashes/",
    "too", "few?",
    "x=1", "y=2"
// result: "http://www.MyUrl.com/too/many/slashes/too/few?x=1&y=2" 

가져 NuGet에 Flurl.Http를 :

PM> 설치 패키지 Flurl.Http

또는 HTTP 기능없이 독립형 URL 빌더 를 확보하십시오.

PM> 설치 패키지 흐름


답변

Uri 당신을 위해 이것을 해야하는 생성자가 있습니다 : new Uri(Uri baseUri, string relativeUri)

예를 들면 다음과 같습니다.

Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");

편집자 주 :이 방법은 예상대로 작동하지 않습니다. 경우에 따라 baseUri의 일부를자를 수 있습니다. 의견 및 기타 답변을 참조하십시오.


답변

이것은 매우 간단한 해결책 일 수 있습니다.

public static string Combine(string uri1, string uri2)
{
    uri1 = uri1.TrimEnd('/');
    uri2 = uri2.TrimStart('/');
    return string.Format("{0}/{1}", uri1, uri2);
}


답변

당신은 사용 Uri.TryCreate( ... ):

Uri result = null;

if (Uri.TryCreate(new Uri("http://msdn.microsoft.com/en-us/library/"), "/en-us/library/system.uri.trycreate.aspx", out result))
{
    Console.WriteLine(result);
}

돌아올 것이다 :

http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx


답변

여기에 이미 훌륭한 답변이 있습니다. mdsharpe 제안에 따라 Uri 인스턴스를 처리 할 때 쉽게 사용할 수있는 확장 방법이 있습니다.

using System;
using System.Linq;

public static class UriExtensions
{
    public static Uri Append(this Uri uri, params string[] paths)
    {
        return new Uri(paths.Aggregate(uri.AbsoluteUri, (current, path) => string.Format("{0}/{1}", current.TrimEnd('/'), path.TrimStart('/'))));
    }
}

그리고 사용 예 :

var url = new Uri("http://example.com/subpath/").Append("/part1/", "part2").AbsoluteUri;

이것은 http://example.com/subpath/part1/part2 를 생성 합니다


답변

Ryan Cook의 답변은 내가 추구하는 것에 가깝고 다른 개발자에게 더 적합 할 수 있습니다. 그러나 문자열의 시작 부분에 http : //를 추가하고 일반적으로 이전보다 조금 더 많은 형식을 지정합니다.

또한 사용 사례의 경우 상대 경로를 해결하는 것이 중요하지 않습니다.

mdsharp의 답변에는 좋은 아이디어의 씨앗도 포함되어 있지만 실제 구현에는 몇 가지 세부 사항이 더 필요했습니다. 이것은 그것을 육체 화하려는 시도입니다 (그리고 나는 이것을 프로덕션에서 사용하고 있습니다) :

씨#

public string UrlCombine(string url1, string url2)
{
    if (url1.Length == 0) {
        return url2;
    }

    if (url2.Length == 0) {
        return url1;
    }

    url1 = url1.TrimEnd('/', '\\');
    url2 = url2.TrimStart('/', '\\');

    return string.Format("{0}/{1}", url1, url2);
}

VB.NET

Public Function UrlCombine(ByVal url1 As String, ByVal url2 As String) As String
    If url1.Length = 0 Then
        Return url2
    End If

    If url2.Length = 0 Then
        Return url1
    End If

    url1 = url1.TrimEnd("/"c, "\"c)
    url2 = url2.TrimStart("/"c, "\"c)

    Return String.Format("{0}/{1}", url1, url2)
End Function

이 코드는 VB에서 발생하는 다음 테스트를 통과합니다.

<TestMethod()> Public Sub UrlCombineTest()
    Dim target As StringHelpers = New StringHelpers()

    Assert.IsTrue(target.UrlCombine("test1", "test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1/", "test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1", "/test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1/", "/test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("/test1/", "/test2/") = "/test1/test2/")
    Assert.IsTrue(target.UrlCombine("", "/test2/") = "/test2/")
    Assert.IsTrue(target.UrlCombine("/test1/", "") = "/test1/")
End Sub


답변

“|”와 같은 문자가있을 수 있으므로 Path.Combine이 작동하지 않습니다. QueryString 인수와 URL에 ArgumentException이 발생합니다.

먼저 새로운 Uri(Uri baseUri, string relativeUri)접근 방식을 시도했지만 다음 과 같은 URI로 인해 실패했습니다 http://www.mediawiki.org/wiki/Special:SpecialPages.

new Uri(new Uri("http://www.mediawiki.org/wiki/"), "Special:SpecialPages")

뒤에 콜론으로 인해 Special : SpecialPages가 발생합니다. Special 가됩니다.

그래서 마침내 mdsharpe / Brian MacKays 경로를 가져 와서 여러 URI 부분으로 작업하기 위해 조금 더 개발해야했습니다.

public static string CombineUri(params string[] uriParts)
{
    string uri = string.Empty;
    if (uriParts != null && uriParts.Length > 0)
    {
        char[] trims = new char[] { '\\', '/' };
        uri = (uriParts[0] ?? string.Empty).TrimEnd(trims);
        for (int i = 1; i < uriParts.Length; i++)
        {
            uri = string.Format("{0}/{1}", uri.TrimEnd(trims), (uriParts[i] ?? string.Empty).TrimStart(trims));
        }
    }
    return uri;
}

용법: CombineUri("http://www.mediawiki.org/", "wiki", "Special:SpecialPages")