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;
답변
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")
