URL සඳහා Path.Combine?


1260

Path.Combine පහසුය , නමුත් URL සඳහා .NET රාමුව තුළ සමාන කාර්යයක් තිබේද?

මම මේ වගේ සින්ටැක්ස් සොයනවා:

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

එය නැවත පැමිණේ:

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


14
ෆ්ලර්ල්ට එය කරන Url.Combineක්‍රමයක් ඇතුළත් වේ .
ටොඩ් මෙනියර්

2
ඇත්ත වශයෙන්ම, // හසුරුවනු ලබන්නේ වෙබ් අඩවිය හෝ සේවාදායකය මෙහෙයවීමෙන් මිස බ්‍රව්සරයෙන් නොවේ. එය ඔබ ලිපින තීරුවට යවනු ඇත. Http: // වෙනුවට htp: // ටයිප් කරන විට අපට ගැටළු ඇති වන්නේ එබැවිනි. එබැවින් // සමහර වෙබ් අඩවි වල විශාල ගැටළු ඇති කළ හැකිය. මම යූආර්එල් හි // තිබේ නම් 404 ක් විසි කරන විශේෂිත වෙබ් අඩවියක් හසුරුවන ක්‍රෝලර් සඳහා මම .dll ලියමි.
ඩේව් ගෝර්ඩන්

Answers:


76

එහි වූ ටොඩ් Menier ගේ අදහස් ඉහත වේ බව 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> Install-Package Flurl


4
හොඳයි, මෙම ප්‍රශ්නයට විශාල තදබදයක් ලැබෙන අතර 1000+ උඩුකුරු සහිත පිළිතුර ඇත්ත වශයෙන්ම සෑම අවස්ථාවකම ක්‍රියා නොකරයි. අවුරුදු ගණනාවකට පසු, මම ඇත්ත වශයෙන්ම මේ සඳහා Flurl භාවිතා කරමි, එබැවින් මම මෙය පිළිගනිමි. මට හමු වූ සෑම අවස්ථාවකම එය ක්‍රියාත්මක වන බව පෙනේ. මිනිසුන්ට යැපීමක් ලබා ගැනීමට අවශ්‍ය නැතිනම්, මම පිළිතුරක් පළ කළෙමි.
බ්‍රයන් මැකේ

ඔබ භාවිතා නොකරන්නේ නම් Flurlසහ සැහැල්ලු අනුවාදයක් පරිපූර්ණ කරන්නේ නම්
lizzy91

1167

Uri ඔබ වෙනුවෙන් මෙය කළ යුතු ඉදිකිරීම්කරුවෙකු ඇත: new Uri(Uri baseUri, string relativeUri)

මෙන්න උදාහරණයක්:

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

සංස්කාරකයෙන් සටහන: පරෙස්සම් වන්න, මෙම ක්‍රමය අපේක්ෂිත පරිදි ක්‍රියාත්මක නොවේ. සමහර අවස්ථාවල එය baseUri හි කොටසක් කපා ගත හැකිය. අදහස් සහ වෙනත් පිළිතුරු බලන්න.


372
මම යූරි පංතිය භාවිතා කිරීමට කැමතියි, අවාසනාවකට එය පාත් මෙන් හැසිරෙන්නේ නැත. උදාහරණයක් ලෙස නව යූරි (නව යූරි (" test.com/mydirectory/" ), "/helloworld.aspx"). ToString () ඔබට " test.com/helloworld.aspx " ලබා දෙයි ; අපට Path.Combine විලාසිතාවේ ප්‍රති .ලයක් අවශ්‍ය නම් එය වැරදිය.
ඩොක්ටර් ජෝන්ස්

196
ඒ සියල්ල කප්පාදුවේ ඇත. සාපේක්ෂ මාර්ග කොටස කප්පාදුවකින් ආරම්භ වන්නේ නම්, එය ඔබ විස්තර කළ ආකාරයට හැසිරේ. නමුත්, ඔබ කප්පාදුව අතහැර දැමුවහොත්, එය ඔබ අපේක්ෂා කළ ආකාරයටම ක්‍රියාත්මක වේ (දෙවන පරාමිතියෙහි නැතිවූ කප්පාදුව සටහන් කරන්න): නව යූරි (නව යූරි (" test.com/mydirectory/" ), "helloworld.aspx" ) .ToString () ප්‍රති results ල " test.com/mydirectory/helloworld.aspx ". Path.Combine ඒ හා සමානව හැසිරේ. සාපේක්ෂ මාර්ග පරාමිතිය කප්පාදුවකින් ආරම්භ වන්නේ නම්, එය ලබා දෙන්නේ සාපේක්ෂ මාර්ගය පමණක් වන අතර ඒවා ඒකාබද්ධ නොවේ.
ජොයෙල් බෙකම්

70
ඔබේ baseUri "test.com/mydirectory/mysubdirectory" ලෙස නම්, ප්‍රති result ලය වනුයේ "test.com/mydirectory/mlowubdirectory/helloworld.aspx" වෙනුවට "test.com/mydirectory/helloworld.aspx" ය. සියුම් වෙනස වන්නේ පළමු පරාමිතිය මත පසුපස කප්පාදුවක් නොමැති වීමයි. දැනට පවතින රාමු ක්‍රම භාවිතා කිරීම සඳහා මම සියල්ලම වෙමි, මට දැනටමත් එහි පසුපස කප්පාදුවක් තිබිය යුතු නම්, මම සිතන්නේ partUrl1 + partUrl2 කිරීම ගඳ සුවඳ අඩු යැයි මට සිතේ - මට එම පසුපස කප්පාදුව වටය පසුපස හඹා යන්නට ඇත. නූල් කොන්කට් නොකිරීම නිසා.
කාල්

64
මට යූආර්අයි ඒකාබද්ධ ක්‍රමයක් අවශ්‍ය එකම හේතුව වන්නේ පසුපස කප්පාදුව පරීක්ෂා කිරීමට මට අවශ්‍ය නොවන බැවිනි. Request.ApplicationPath යනු ඔබේ යෙදුම මුල නම් '/', නමුත් එය නොමැති නම් '/ foo' වේ.
nickd

24
I -1 මෙම පිළිතුර ගැටලුවට පිළිතුරු නොදෙන නිසා. ඔබට url ඒකාබද්ධ කිරීමට අවශ්‍ය වූ විට, ඔබට Path.Combine භාවිතා කිරීමට අවශ්‍ය වූ විට මෙන්, ඔබට පසුපස යාම / ගැන සැලකිලිමත් වීමට අවශ්‍ය නැත. මේ සමඟ, ඔබ සැලකිලිමත් විය යුතුයි. ඉහත බ්‍රයන් මැකේ හෝ mdsharpe විසඳුමට මම කැමතියි
බැප්ටිස්ට් පර්නෙට්

163

මෙය සුදුසු සරල විසඳුමක් විය හැකිය:

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

7
+1: මෙය සාපේක්ෂ ශෛලීය මාර්ග (../../whatever.html) හසුරුවන්නේ නැතත්, එහි සරල බව සඳහා මම මේකට කැමතියි. මම '\' චරිතය සඳහා ටිම් ද එකතු කරමි.
බ්‍රයන් මැකේ

3
මෙහි වඩාත් සම්පූර්ණ මාංසමය අනුවාදයක් සඳහා මගේ පිළිතුර බලන්න.
බ්‍රයන් මැකේ

148

ඔබ භාවිතා කරන්නේ 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


53
+1: ප්‍රතිදාන පරාමිතිය සමඟ මට අතාර්කික ගැටලුවක් තිබුණද මෙය හොඳයි. ;)
බ්‍රයන් මැකේ

10
Rian බ්‍රයන්: එය උදව් කරන්නේ නම්, සියලු ට්‍රයිඑක්ස්එක්ස් ක්‍රම ( int.TryParse, DateTime.TryParseExact) ට මෙම ප්‍රතිදාන පරාමිතිය තිබේ නම් ඒවා if-statement එකක භාවිතා කිරීම පහසු කරයි. Btw, මෙම උදාහරණයේ දී රයන් කළාක් මෙන් ඔබට විචල්‍යය ආරම්භ කිරීමට අවශ්‍ය නැත.
අබෙල්

41
මෙම පිළිතුර ජොයෙල්ගේ ගැටලුවටම ගොදුරු වේ : සම්බන්ධ වීම test.com/mydirectory/සහ /helloworld.aspxඑහි ප්‍රති result ලය වනු test.com/helloworld.aspxඇත්තේ ඔබට අවශ්‍ය දේ නොවන බව පෙනේ.
මැට් කොකාජ්

3
හායි, මෙය පහත සඳහන් දෑ සඳහා අසමත් විය: if (Uri.TryCreate (නව යූරි (" localhost / MyService /" ), "/ Event / SomeMethod? Abc = 123", ප්‍රති result ලය)) {Console.WriteLine (ප්‍රති result ලය); Result එය මට ප්‍රති result ල පෙන්වන්නේ : localhost / Event / SomeMethod? Abc = 123 සටහන: "http: //" යූරි පාදමේ සිට මෙහි ප්‍රතිස්ථාපනය වන්නේ ස්ටැක් ඕවර් ප්‍රවාහයෙනි
ෆයිසාල් එම්ක්

3
AFaisalMq ඔබ මූල-සාපේක්ෂ දෙවන පරාමිතිය පසු කළ බැවින් මෙය නිවැරදි හැසිරීමයි. ඔබ දෙවන පරාමිතියෙහි ප්‍රමුඛ / අතහැර දමා ඇත්නම්, ඔබ අපේක්ෂා කළ ප්‍රති result ලය ඔබට ලැබෙනු ඇත.
ටොම් ලින්ට්

127

දැනටමත් මෙහි හොඳ පිළිතුරු කිහිපයක් තිබේ. Mdsharpe යෝජනාව මත පදනම්ව, ඔබට යූරි සිද්ධීන් සමඟ කටයුතු කිරීමට අවශ්‍ය විට පහසුවෙන් භාවිතා කළ හැකි දිගු ක්‍රමයක් මෙන්න:

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 නිපදවනු ඇත


2
මෙම විසඳුම Pri.Combine () ට බොහෝ සමානකම් ඇති ස්ථිතික ක්‍රමයක් වන UriUtils.Combine ("base url", "part1", "part2", ...) ලිවීම ඉතා සුළු කාරණයක් කරයි. හොඳයි!
angularsen

සාපේක්ෂ යූආර්අයි සඳහා සහය දැක්වීම සඳහා මට නිරපේක්ෂ ඉදිකිරීම්කරු තුළ නිරපේක්ෂ යූරි සහ යූරිකින්ඩ් වෙනුවට ටෝස්ට්‍රිං () භාවිතා කිරීමට සිදු විය.
angularsen

සාපේක්ෂ යූරිස් පිළිබඳ තොරතුරකට ස්තූතියි. අවාසනාවකට යූරි විසින් සාපේක්ෂ මාර්ග සමඟ ගනුදෙනු කිරීම පහසු නොකරයි, මන්ද සෑම විටම ඉල්ලීම සමඟ යම්කිසි විකාරයක් ඇත. යෙදුම් මාර්ගය සම්බන්ධ වේ. සමහර විට ඔබට නව යූරි (HttpContext.Current.Request.ApplicationPath) පදනමක් ලෙස භාවිතා කර උත්සාහ කළ හැකිය. මෙය ඔබට නිරපේක්ෂ මාර්ග ලබා දෙන නමුත් අඩවි ව්‍යුහය තුළ ඕනෑම තැනක වැඩ කළ යුතුය.
ඇලෙස් පොටොක්නික් හහෝනිනා

මහා. එය වෙනත් කෙනෙකුට උපකාර කිරීම ගැන සතුටුයි. කලක සිට මෙය භාවිතා කර ඇති අතර කිසිදු ගැටළුවක් නොමැත.
ඇලෙස් පොටොක්නික් හහෝනිනා

එකතු කිරීම සඳහා වන මාර්ග කිසිවක් ශුන්‍ය හෝ හිස් නූලක් නොවේදැයි මම පරීක්ෂා කළෙමි.
n.podbielski

94

රයන් කුක්ගේ පිළිතුර මා පසු වූ දෙයට සමීප වන අතර අනෙක් සංවර්ධකයින් සඳහා වඩාත් සුදුසු විය හැකිය. කෙසේ වෙතත්, එය නූල් ආරම්භයට 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

4
විස්තර කතා කිරීම: ArgumentNullException("url1")තර්කය නම් අනිවාර්යය ගැන කුමක් කිව Nothingහැකිද? කණගාටුයි, අච්චාරු වීම ;-). බැක්ස්ලෑෂ් යූආර්අයි හි කිසිදු සම්බන්ධයක් නැති බව සලකන්න (එය තිබේ නම් එය කප්පාදු නොකළ යුතුය), එබැවින් ඔබට එය ඔබේ ට්‍රිම්එක්ස්එක්ස් වෙතින් ඉවත් කළ හැකිය.
අබෙල්

4
ඔබට පරාමිති නූල් [] භාවිතා කළ හැකි අතර සංයෝජන 2 කට වඩා වැඩි ගණනකට ඉඩ දීම සඳහා පුනරාවර්තන ලෙස ඔවුන් හා එක්වන්න
ජයිඩර්

4
මට විශ්වාසයි මෙය පාත් කොම්බයින් වැනි මූලික පන්ති පුස්තකාලයේ තිබෙන්නට ඇතැයි කියා.
යූරියා බ්ලැතර්වික්

1
Ark මාක්හර්ඩ් මම කේතය නැවත සංස්කරණය කළෙමි, එවිට එය චර්යාත්මකව C # ට සමාන වන අතර කෘතිමව සමාන වේ.
ජේජේ

1
Rian බ්‍රයන්මැක් මම එය බිඳ දැමුවෙමි, මාක්හර්ඩ් මගේ වැරැද්ද පෙන්වා ආපසු පෙරළා දැමුවෙමි, මම නැවත යාවත්කාලීන කළෙමි ... චියර්ස්
ජේජේ

38

Path.Combine මා වෙනුවෙන් ක්‍රියා නොකරන්නේ "|" වැනි අක්ෂර තිබිය හැකි බැවිනි QueryString තර්ක වල සහ එම නිසා URL ය, එහි ප්‍රති Ar ලයක් ලෙස ArgumentException.

මම මුලින්ම නව Uri(Uri baseUri, string relativeUri)ප්‍රවේශය අත්හදා බැලුවෙමි , එය යූආර්අයි වැනි නිසා මට අසමත් විය http://www.mediawiki.org/wiki/Special:SpecialPages:

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

එහි ප්‍රති result ලය වනුයේ විශේෂ: විශේෂ පිටු, ඊට පසු මහා බඩවැල් නිසා Specialයෝජනා ක්‍රමයක් දක්වයි.

ඒ නිසා මට අවසානයේදී mdsharpe / බ්‍රයන් මැකේස් මාර්ගයෙන් ගමන් කිරීමට සිදු වූ අතර එය යූආර්අයි කොටස් කිහිපයක් සමඟ වැඩ කිරීම සඳහා තව ටිකක් දියුණු විය:

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


2
+1: දැන් අපි කතා කරනවා ... මම මෙය අත්හදා බලන්නම්. මෙය නව පිළිගත් පිළිතුර ලෙස පවා අවසන් විය හැකිය. නව යූරි () ක්‍රමයට උත්සාහ කිරීමෙන් පසු මම එයට කැමති නැත. ඕනෑවට වඩා සිනිඳුයි.
බ්‍රයන් මැකේ

මට අවශ්‍ය වූයේ මෙයයි! මා පසුපස කප්පාදුවක් තැබූ ස්ථානය ගැන සැලකිලිමත් වීමට රසිකයෙක් නොවීය ...
ග්‍රෝමර්

+1 ශුන්‍ය පරීක්ෂාව සඳහා පෙරළීම සඳහා එය පුපුරා නොයනු ඇත.
NightOwl888

ගණන් කිරීම () දිග විය යුතු අතර ඒ සඳහා ලින්ක් ඔබේ පුස්තකාලයට ඇතුළත් කිරීමට අවශ්‍ය නොවේ.
පීආර්මන්

මෙය මා සොයන දේමයි.
ThePeter

34

ඔබ ලබා දුන් නියැදි URL මත පදනම්ව , ඔබේ වෙබ් අඩවියට සාපේක්ෂව URL ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය යැයි මම සිතමි.

මෙම උපකල්පනය මත පදනම්ව, ඔබේ ප්‍රශ්නයට වඩාත්ම උචිත ප්‍රතිචාරය ලෙස මම මෙම විසඳුම යෝජනා කරමි: "Path.Combine පහසුය, URL සඳහා රාමුව තුළ සමාන කාර්යයක් තිබේද?"

එහි සිට වන්නේ සමානව ක්රියාත්මක "VirtualPathUtility.Combine" ක්රමය: මම නිවැරදි ද මා යෝජනා කරනවා URL ලිපින සඳහා රාමුවක් තුළ. මෙන්න MSDN යොමු සබැඳිය: VirtualPathUtility.Combine Method

එක් අවවාදයක් ඇත: මෙය ක්‍රියාත්මක වන්නේ ඔබේ වෙබ් අඩවියට සාපේක්ෂව URL සඳහා පමණක් බව මම විශ්වාස කරමි (එනම්, වෙනත් වෙබ් අඩවියකට සබැඳි ජනනය කිරීමට ඔබට එය භාවිතා කළ නොහැක. උදාහරණයක් ලෙස var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");).


+1 එය මා සොයන දෙයට ආසන්න බැවින් එය ඕනෑම පැරණි යූආර්එල් එකක් සඳහා වැඩ කරන්නේ නම් එය වඩාත් සුදුසු වේ. Mdsharpe යෝජනා කළ දෙයට වඩා එය අලංකාර වනු ඇතැයි මම දෙගුණ කරමි.
බ්‍රයන් මැකේ

2
අවවාදය නිවැරදි ය, එයට නිරපේක්ෂ යූරිස් සමඟ ක්‍රියා කළ නොහැකි අතර ප්‍රති result ලය සෑම විටම මුල සිට සාපේක්ෂ වේ. නමුත් එයට අමතර ප්‍රතිලාභයක් ඇත, එය "~ /" මෙන් ටිල්ඩ් සැකසෙයි. මෙය කෙටිමඟක් Server.MapPathහා ඒකාබද්ධ කිරීමක් කරයි.
අබෙල්

25
Path.Combine("Http://MyUrl.com/", "/Images/Image.jpg").Replace("\\", "/")

12
path.Replace(Path.DirectorySeparatorChar, '/');
ජයිඩර්

5
path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
SliverNinja - MSFT

1
/ Path.Combine ( "- එය ඔබ දෙවන arg එනම්" / රූප "පළමු / ඉවත් කළ යුතුය, wrk ලබා ගැනීමට Http://MyUrl.com ", "රූප / Image.jpg")
එක් ජී

8
LiSliverNinja එය නිවැරදි නොවේ මෙම ක්ෂේත්‍රයේ වටිනාකම යුනික්ස් හි බැක්ස්ලෑෂ් ('\') සහ වින්ඩෝස් සහ මැකින්ටොෂ් මෙහෙයුම් පද්ධතිවල කප්පාදුවක් ('/') වේ. ලිනක්ස් පද්ධතියක මොනෝ භාවිතා කරන විට, ඔබට වැරදි බෙදුම්කරු ලැබෙනු ඇත.
user247702

6
ඩිරෙක්ටරි බෙදුම්කරු දෙස බලා සිටින සියලුම යාලුවන්ට අමතක වී ඇත්තේ ඔබ දැන් සිටින තත්වයට වඩා වෙනස් මෙහෙයුම් පද්ධතියකින් නූල් පැමිණිය හැකි බවයි. බැක්ස්ලෑෂ් ඉදිරි කප්පාදුව වෙනුවට ආදේශ කරන්න, එවිට ඔබ ආවරණය වේ.
ජෙරමි වීර්

17

මම දැන් කුඩා ව්‍යාප්ති ක්‍රමයක් එක් කළෙමි:

public static string UriCombine (this string val, string append)
        {
            if (String.IsNullOrEmpty(val)) return append;
            if (String.IsNullOrEmpty(append)) return val;
            return val.TrimEnd('/') + "/" + append.TrimStart('/');
        }

එය මේ ආකාරයෙන් භාවිතා කළ හැකිය:

"www.example.com/".UriCombine("/images").UriCombine("first.jpeg");

12

විට්ටි උදාහරණය, ​​රයන්, ශ්‍රිතයට සබැඳියකින් අවසන් කිරීමට. හොඳට කලා.

එක් නිර්දේශයක් බ්‍රයන්: ඔබ මෙම කේතය ශ්‍රිතයක් තුළට ඔතා ඇත්නම්, ට්‍රයික්‍රීට් ඇමතුමට පෙර මූලික URL එක එතීමට යූරිබිල්ඩර් භාවිතා කිරීමට ඔබට අවශ්‍ය විය හැකිය.

එසේ නොමැතිනම්, මූලික URL එකෙහි යෝජනා ක්‍රමය ඇතුළත් විය යුතුය (එහිදී යූරිබිල්ඩර් http: // උපකල්පනය කරයි). සිතුවිල්ලක් පමණි:

public string CombineUrl(string baseUrl, string relativeUrl) {
    UriBuilder baseUri = new UriBuilder(baseUrl);
    Uri newUri;

    if (Uri.TryCreate(baseUri.Uri, relativeUrl, out newUri))
        return newUri.ToString();
    else
        throw new ArgumentException("Unable to combine specified url values");
}

10

ඒවා ඒකාබද්ධ කර එය සැමවිටම නිවැරදි බව සහතික කිරීමට පහසු ක්‍රමයක් නම්:

string.Format("{0}/{1}", Url1.Trim('/'), Url2);

+1, මෙය mdsharpe ගේ පිළිතුරට බෙහෙවින් සමාන වුවත්, මගේ පිළිතුරෙන් එය වැඩිදියුණු විය. Url2 ආරම්භ වන්නේ / හෝ with සමඟ හෝ Url1 අහම්බෙන් \ වලින් අවසන් වුවහොත් හෝ එකක් හිස්ව ඇත්නම් මිස මෙම අනුවාදය විශිෂ්ට ලෙස ක්‍රියා කරයි! :)
බ්‍රයන් මැකේ

9

URL එකක කොටස් කිහිපයක් ඒකාබද්ධ කිරීම ටිකක් උපක්‍රමශීලී විය හැකිය. ඔබට පරාමිති දෙකේ ඉදිකිරීම්කරු Uri(baseUri, relativeUri)භාවිතා කළ හැකිය, නැතහොත් ඔබට Uri.TryCreate()උපයෝගිතා ශ්‍රිතය භාවිතා කළ හැකිය .

එක්කෝ නඩුවේ, මෙම ක්රම පළමු පරාමිතිය සාපේක්ෂ කොටස් ගලවා truncating දිගටම නිසා ඔබ වැරදි ප්රතිඵලයක් නැවත අවසන් විය baseUriවගේ දෙයක් සිට, එනම්, http://google.com/some/thingකිරීමට http://google.com.

අවසාන URL එකකට කොටස් කිහිපයක් ඒකාබද්ධ කිරීමට ඔබට පහත කාර්යයන් දෙක පිටපත් කළ හැකිය:

    public static string Combine(params string[] parts)
    {
        if (parts == null || parts.Length == 0) return string.Empty;

        var urlBuilder = new StringBuilder();
        foreach (var part in parts)
        {
            var tempUrl = tryCreateRelativeOrAbsolute(part);
            urlBuilder.Append(tempUrl);
        }
        return VirtualPathUtility.RemoveTrailingSlash(urlBuilder.ToString());
    }

    private static string tryCreateRelativeOrAbsolute(string s)
    {
        System.Uri uri;
        System.Uri.TryCreate(s, UriKind.RelativeOrAbsolute, out uri);
        string tempUrl = VirtualPathUtility.AppendTrailingSlash(uri.ToString());
        return tempUrl;
    }

භාවිතය නිරූපණය කිරීම සඳහා ඒකක පරීක්ෂණ සහිත සම්පූර්ණ කේතය https://uricombine.codeplex.com/SourceControl/latest#UriCombine/Uri.cs වෙතින් සොයාගත හැකිය.

වඩාත් පොදු අවස්ථා තුන ආවරණය කිරීම සඳහා මට ඒකක පරීක්ෂණ තිබේ:

රූප විස්තරය මෙහි ඇතුළත් කරන්න


2
මට ගොඩක් හොඳයි වගේ. වඩා හොඳ පැහැදිලි කිරීමක් සඳහා ඔබට I පුඩුවක් foreach loop එකකින් ආදේශ කළ හැකි වුවද.
ක්‍රිස් මාරිසික්

ස්තූතියි ක්‍රිස්. Foreach භාවිතා කිරීම සඳහා මම මගේ කේතය වෙනස් කර ඇත.
2014

1
සියලු අමතර උත්සාහයන් සඳහා +1. ඉහළ ඡන්දය දුන් සමහර පිළිතුරු සඳහා මට මෙම ප්‍රශ්නය මඳක් පවත්වා ගැනීමට අවශ්‍යයි. ;)
බ්‍රයන් මැකේ

කණගාටුයි, නමුත් ප්‍රමාණවත් නොවේ. ඔබ පෙන්වන අවස්ථා කිහිපය තුළ ක්‍රියා කරන නමුත් අල් සංයෝජනයන්හි භාවිතයට වඩා දුරින්. නිදසුනක් වශයෙන්, මාර්ගයේ ඇති කොලොන් වලට හානියක් සිදු වේ.
ගොබර්

කරුණාකර ඔබ අදහස් කරන දෙයට උදාහරණයක් දෙන්න පුළුවන්ද? ගැටලුව විසඳීමට සහ ඊළඟ පරිශීලකයින්ට උදව් කිරීමට මම සතුටු වෙමි.
2014

7

UriBuilderමේ වගේ දෙයක් සඳහා මම හොඳින් වැඩ කළ බව මට පෙනී ගියේය:

UriBuilder urlb = new UriBuilder("http", _serverAddress, _webPort, _filePath);
Uri url = urlb.Uri;
return url.AbsoluteUri;

වැඩි ඉදිකිරීම්කරුවන් සහ ප්‍රලේඛන සඳහා යූරිබිල්ඩර් පන්තිය - එම්එස්ඩීඑන් බලන්න .


5

මම පහත සඳහන් දෑ ප්‍රයෝජනවත් වන අතර පහත ලක්ෂණ ඇත:

  • ශුන්‍ය හෝ සුදු අවකාශය මතට විසි කරයි
  • paramsබහු Url කොටස් සඳහා බහු පරාමිතියක් ගනී
  • ශුන්‍ය හෝ හිස් මත විසි කරයි

පන්තිය

public static class UrlPath
{
   private static string InternalCombine(string source, string dest)
   {
      if (string.IsNullOrWhiteSpace(source))
         throw new ArgumentException("Cannot be null or white space", nameof(source));

      if (string.IsNullOrWhiteSpace(dest))
         throw new ArgumentException("Cannot be null or white space", nameof(dest));

      return $"{source.TrimEnd('/', '\\')}/{dest.TrimStart('/', '\\')}";
   }

   public static string Combine(string source, params string[] args) 
       => args.Aggregate(source, InternalCombine);
}

පරීක්ෂණ

UrlPath.Combine("test1", "test2");
UrlPath.Combine("test1//", "test2");
UrlPath.Combine("test1", "/test2");

// Result = test1/test2

UrlPath.Combine(@"test1\/\/\/", @"\/\/\\\\\//test2", @"\/\/\\\\\//test3\") ;

// Result = test1/test2/test3

UrlPath.Combine("/test1/", "/test2/", null);
UrlPath.Combine("", "/test2/");
UrlPath.Combine("/test1/", null);

// Throws an ArgumentException

පරීක්ෂණ සමඟ ඇති සමහර ගැටළු: // ප්‍රති ult ල = test1 / test2 / test3 the 4 වන සහ අවසාන විසි කිරීමේ පරීක්ෂණ සඳහා ArgumentException වෙනුවට ArgumentNullException ලබා දෙයි
Moriya

4

මෙන්න මයික්‍රොසොෆ්ට් හි (OfficeDev PnP) ක්‍රමය UrlUtility.Combine :

    const char PATH_DELIMITER = '/';

    /// <summary>
    /// Combines a path and a relative path.
    /// </summary>
    /// <param name="path"></param>
    /// <param name="relative"></param>
    /// <returns></returns>
    public static string Combine(string path, string relative) 
    {
        if(relative == null)
            relative = String.Empty;

        if(path == null)
            path = String.Empty;

        if(relative.Length == 0 && path.Length == 0)
            return String.Empty;

        if(relative.Length == 0)
            return path;

        if(path.Length == 0)
            return relative;

        path = path.Replace('\\', PATH_DELIMITER);
        relative = relative.Replace('\\', PATH_DELIMITER);

        return path.TrimEnd(PATH_DELIMITER) + PATH_DELIMITER + relative.TrimStart(PATH_DELIMITER);
    }

මුලාශ්‍රය: GitHub


මෙය URL වලට වඩා මාර්ග සඳහා විය හැකි බව පෙනේ.
බ්‍රයන් මැකේ

RianBrianMacKay එය පෙනෙන බව එකඟ වූ නමුත් එය UrlUtility පන්තියේ සිට URL ඒකාබද්ධ කිරීමේ සන්දර්භය තුළ භාවිතා කරයි

2
එය අයත් වන්නේ කුමන

මෙම පංතිය භාවිතා කිරීමේදී ප්‍රවේශම් වන්න, ඉතිරි පන්තියේ ෂෙයාර්පොයින්ට් විශේෂිත කෞතුක වස්තු අඩංගු වේ.
හැරී බෙරී

3

මගේ සාමාන්‍ය විසඳුම:

public static string Combine(params string[] uriParts)
{
    string uri = string.Empty;
    if (uriParts != null && uriParts.Any())
    {
        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;
}

මෙම සහායක ක්‍රමය ඉතා නම්‍යශීලී වන අතර විවිධ භාවිත අවස්ථා වලදී හොඳින් ක්‍රියා කරයි. ඔබට ස්තුතියි!
ශිව

3

මම මෙම ක්‍රියාව නිර්මාණය කළේ ඔබේ ජීවිතය පහසු කරවන අයුරිනි:

    /// <summary>
    /// The ultimate Path combiner of all time
    /// </summary>
    /// <param name="IsURL">
    /// true - if the paths are Internet URLs, false - if the paths are local URLs, this is very important as this will be used to decide which separator will be used.
    /// </param>
    /// <param name="IsRelative">Just adds the separator at the beginning</param>
    /// <param name="IsFixInternal">Fix the paths from within (by removing duplicate separators and correcting the separators)</param>
    /// <param name="parts">The paths to combine</param>
    /// <returns>the combined path</returns>
    public static string PathCombine(bool IsURL , bool IsRelative , bool IsFixInternal , params string[] parts)
    {
        if (parts == null || parts.Length == 0) return string.Empty;
        char separator = IsURL ? '/' : '\\';

        if (parts.Length == 1 && IsFixInternal)
        {
            string validsingle;
            if (IsURL)
            {
                validsingle = parts[0].Replace('\\' , '/');
            }
            else
            {
                validsingle = parts[0].Replace('/' , '\\');
            }
            validsingle = validsingle.Trim(separator);
            return (IsRelative ? separator.ToString() : string.Empty) + validsingle;
        }

        string final = parts
            .Aggregate
            (
            (string first , string second) =>
            {
                string validfirst;
                string validsecond;
                if (IsURL)
                {
                    validfirst = first.Replace('\\' , '/');
                    validsecond = second.Replace('\\' , '/');
                }
                else
                {
                    validfirst = first.Replace('/' , '\\');
                    validsecond = second.Replace('/' , '\\');
                }
                var prefix = string.Empty;
                if (IsFixInternal)
                {
                    if (IsURL)
                    {
                        if (validfirst.Contains("://"))
                        {
                            var tofix = validfirst.Substring(validfirst.IndexOf("://") + 3);
                            prefix = validfirst.Replace(tofix , string.Empty).TrimStart(separator);

                            var tofixlist = tofix.Split(new[] { separator } , StringSplitOptions.RemoveEmptyEntries);

                            validfirst = separator + string.Join(separator.ToString() , tofixlist);
                        }
                        else
                        {
                            var firstlist = validfirst.Split(new[] { separator } , StringSplitOptions.RemoveEmptyEntries);
                            validfirst = string.Join(separator.ToString() , firstlist);
                        }

                        var secondlist = validsecond.Split(new[] { separator } , StringSplitOptions.RemoveEmptyEntries);
                        validsecond = string.Join(separator.ToString() , secondlist);
                    }
                    else
                    {
                        var firstlist = validfirst.Split(new[] { separator } , StringSplitOptions.RemoveEmptyEntries);
                        var secondlist = validsecond.Split(new[] { separator } , StringSplitOptions.RemoveEmptyEntries);

                        validfirst = string.Join(separator.ToString() , firstlist);
                        validsecond = string.Join(separator.ToString() , secondlist);
                    }
                }
                return prefix + validfirst.Trim(separator) + separator + validsecond.Trim(separator);
            }
            );
        return (IsRelative ? separator.ToString() : string.Empty) + final;
    }

එය URL සඳහා මෙන්ම සාමාන්‍ය මාර්ග සඳහාද ක්‍රියා කරයි.

භාවිතය:

    // Fixes internal paths
    Console.WriteLine(PathCombine(true , true , true , @"\/\/folder 1\/\/\/\\/\folder2\///folder3\\/" , @"/\somefile.ext\/\//\"));
    // Result: /folder 1/folder2/folder3/somefile.ext

    // Doesn't fix internal paths
    Console.WriteLine(PathCombine(true , true , false , @"\/\/folder 1\/\/\/\\/\folder2\///folder3\\/" , @"/\somefile.ext\/\//\"));
    //result : /folder 1//////////folder2////folder3/somefile.ext

    // Don't worry about URL prefixes when fixing internal paths
    Console.WriteLine(PathCombine(true , false , true , @"/\/\/https:/\/\/\lul.com\/\/\/\\/\folder2\///folder3\\/" , @"/\somefile.ext\/\//\"));
    // Result: https://lul.com/folder2/folder3/somefile.ext

    Console.WriteLine(PathCombine(false , true , true , @"../../../\\..\...\./../somepath" , @"anotherpath"));
    // Result: \..\..\..\..\...\.\..\somepath\anotherpath

3

පහත සඳහන් දේ පමණක් භාවිතා නොකරන්නේ ඇයි?

System.IO.Path.Combine(rootUrl, subPath).Replace(@"\", "/")

මම මෙහි පවර්ෂෙල් අනුවාදය සොයමින් සිටියෙමි: [System.IO.Path]::Combine("http://MyUrl.com/","/Images/Image.jpg")කෙසේ වෙතත් මෙය ප්‍රති result ලයක් ලෙස අසමත් වේ : /Images/Image.jpg. /දෙවන උප මාර්ගයෙන් ඉවත් කරන්න, එය ක්‍රියා කරයි:[System.IO.Path]::Combine("http://MyUrl.com/","Images/Image.jpg")
ප්‍රතිලෝම

හොඳ අදහසක්, නමුත් එක් පරාමිතියක් ශුන්‍ය වූ විට එය අසාර්ථක වේ.
pholpar

2

යූආර්අයි සමඟ URL ඒකාබද්ධ කරන අතරතුර නීති

අමුතු හැසිරීම් වලක්වා ගැනීම සඳහා අනුගමනය කළ යුතු එක් රීතියක් තිබේ:

  • මාර්ගය (නාමාවලිය) '/' සමඟ අවසන් විය යුතුය. '/' නොමැතිව මාර්ගය අවසන් වුවහොත්, අවසාන කොටස ගොනු නාමයක් ලෙස සලකනු ලබන අතර, ඊළඟ URL කොටස සමඟ සංයුක්ත කිරීමට උත්සාහ කරන විට එය සංයුක්ත වේ.
  • එක් ව්‍යතිරේකයක් ඇත: මූලික URL ලිපිනය (නාමාවලි තොරතුරු නොමැතිව) '/' සමඟ අවසන් නොවිය යුතුය
  • මාර්ග කොටස '/' සමඟ ආරම්භ නොවිය යුතුය. එය '/' සමඟ ආරම්භ වුවහොත්, URL වෙතින් දැනට පවතින සෑම සාපේක්ෂ තොරතුරක්ම අතහැර දමනු ලැබේ ... string.Emptyකොටස් මාර්ගයක් එක් කිරීමෙන් URL වෙතින් සාපේක්ෂ නාමාවලියද ඉවත් වේ!

ඔබ ඉහත නීති රීති අනුගමනය කරන්නේ නම්, ඔබට පහත කේතය සමඟ URL ඒකාබද්ධ කළ හැකිය. ඔබගේ තත්වය අනුව, ඔබට URL වෙත 'ඩිරෙක්ටරි' කොටස් කිහිපයක් එකතු කළ හැකිය ...

        var pathParts = new string[] { destinationBaseUrl, destinationFolderUrl, fileName };

        var destination = pathParts.Aggregate((left, right) =>
        {
            if (string.IsNullOrWhiteSpace(right))
                return left;

            return new Uri(new Uri(left), right).ToString();
        });

2

ASP.NET Core (Microsoft.Owin හි ද ඇත) හි Flurl වැනි තෙවන පාර්ශවීය යැපීමක් එක් කිරීමට හෝ අභිරුචි දිගු කිරීමේ ක්‍රමයක් නිර්මාණය කිරීමට ඔබට අවශ්‍ය නැතිනම්, ඔබට PathStringURI ගොඩනැගීම සඳහා අදහස් කරන භාවිතා කළ හැකිය. මාර්ග. එවිට ඔබට මෙම සංයෝජනයෙන් ඔබේ සම්පූර්ණ යූආර්අයි නිර්මාණය කළ හැකිය, Uriසහ UriBuilder.

මෙම අවස්ථාවේ දී, එය වනුයේ:

new Uri(new UriBuilder("http", "MyUrl.com").Uri, new PathString("/Images").Add("/Image.jpg").ToString())

මූලික URL හි බෙදුම්කරුවන් සඳහන් නොකර මෙය ඔබට සියලුම සං parts ටක කොටස් ලබා දෙයි. අවාසනාවකට මෙන්, එක් එක් නූලට පෙර සූදානමක් PathStringඅවශ්‍ය වේ නම් /එය ඇත්ත වශයෙන්ම විසි කරයි ArgumentException! නමුත් අවම වශයෙන් ඔබට පහසුවෙන් පරීක්ෂා කළ හැකි ආකාරයකින් ඔබේ යූආර්අයි නිර්ණායක ලෙස ගොඩනගා ගත හැකිය.


2

එබැවින් මට යූරිබිල්ඩර් භාවිතා කළ සෑම කෙනෙකුටම සමාන තවත් ප්‍රවේශයක් ඇත.

ජාවාජවජවාජවාජාව කළාක් මෙන් මගේ BaseUrl (මාර්ගයේ කොටසක් අඩංගු විය හැකිය - උදා: http://mybaseurl.com/dev/ ) බෙදීමට මට අවශ්‍ය නොවීය.

පහත දැක්වෙන ස්නිපටයේ + ටෙස්ට් කේතය පෙන්වයි.

පරෙස්සම් වන්න: මෙම විසඳුම ධාරකය පහත් කොට වරායක් එකතු කරයි. මෙය අපේක්‍ෂා නොකරන්නේ නම්, යමෙකුට Uriදේපල උත්තේජනය කිරීමෙන් නූල් නිරූපණයක් ලිවිය හැකිය UriBuilder.

  public class Tests
  {
         public static string CombineUrl (string baseUrl, string path)
         {
           var uriBuilder = new UriBuilder (baseUrl);
           uriBuilder.Path = Path.Combine (uriBuilder.Path, path);
           return uriBuilder.ToString();
         }

         [TestCase("http://MyUrl.com/", "/Images/Image.jpg", "http://myurl.com:80/Images/Image.jpg")]
         [TestCase("http://MyUrl.com/basePath", "/Images/Image.jpg", "http://myurl.com:80/Images/Image.jpg")]
         [TestCase("http://MyUrl.com/basePath", "Images/Image.jpg", "http://myurl.com:80/basePath/Images/Image.jpg")]
         [TestCase("http://MyUrl.com/basePath/", "Images/Image.jpg", "http://myurl.com:80/basePath/Images/Image.jpg")]
         public void Test1 (string baseUrl, string path, string expected)
         {
           var result = CombineUrl (baseUrl, path);

           Assert.That (result, Is.EqualTo (expected));
         }
  }

වින්ඩෝස් 10 හි .NET Core 2.1 සමඟ පරීක්ෂා කර ඇත.

මෙය ක්‍රියාත්මක වන්නේ ඇයි?

වුවත් Path.CombineBackslashes ආපසු (වින්ඩෝස් කටවත් මත), එම UriBuilder වන පන්දු ඔසවන්නා ලෙස මෙම නඩුව හසුරුවන Path.

Https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/src/System/UriBuilder.cs වෙතින් ලබා ගත් (ඇමතුම මතක තබා ගන්න string.Replace)

[AllowNull]
public string Path
{
      get
      {
          return _path;
      }
      set
      {
          if ((value == null) || (value.Length == 0))
          {
              value = "/";
          }
          _path = Uri.InternalEscapeString(value.Replace('\\', '/'));
          _changed = true;
      }
 }

මෙය හොඳම ප්‍රවේශයද?

නිසැකවම මෙම විසඳුම ස්වයං විස්තර කිරීමකි (අවම වශයෙන් මගේ මතය අනුව). නමුත් ඔබ ලේඛනගත නොකළ (අවම වශයෙන් ඉක්මන් ගූගල් සෙවුමක් සමඟ කිසිවක් සොයා ගත්තේ නැත) .NET API වෙතින් "විශේෂාංගය" මත විශ්වාසය තබයි. අනාගත නිකුතුවක් සමඟ මෙය වෙනස් විය හැකි බැවින් කරුණාකර ටෙස්ට් සමඟ ක්‍රමය ආවරණය කරන්න.

දී පරීක්ෂණ ඇත https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs ( Path_Get_Setමෙම නම්, පරීක්ෂා කරන) \නිවැරදිව පරිවර්තනය වී ඇත.

පැති සටහන: යූරි කෝටරයක් UriBuilder.Uriසඳහා භාවිතා කරන්නේ නම් System.Uriයමෙකුට දේපල සමඟ කෙලින්ම වැඩ කළ හැකිය.


මෙය ඉතා විශ්වාසදායක ප්‍රවේශයකි. ඒකක පරීක්ෂණය සඳහා සුදානම් !!
aggsol

2

එක්-ලයිනර් එකක් සොයන සහ නව ක්‍රමයක් නිර්මාණය නොකර හෝ නව පුස්තකාලයක් යොමු නොකර හෝ යූආර්අයි අගයක් ගොඩනඟා එය නූලක් බවට පරිවර්තනය නොකර මාර්ගයක කොටස් වලට සම්බන්ධ වීමට කැමති ඕනෑම කෙනෙකුට, එසේ නම් ...

string urlToImage = String.Join("/", "websiteUrl", "folder1", "folder2", "folder3", "item");

එය ඉතා මූලික ය, නමුත් ඔබට තවත් අවශ්‍ය දේ මම නොදනිමි. '/' දෙගුණ කිරීමට ඔබ බිය වන්නේ නම් ඔබට පසුව කළ හැකිය .Replace("//", "/"). 'Https: //' හි දෙගුණ කළ '//' ප්‍රතිස්ථාපනය කිරීමට ඔබ බිය වන්නේ නම්, ඒ වෙනුවට එක් සම්බන්ධතාවයක් කරන්න, දෙගුණ කළ '/' ආදේශ කරන්න, ඉන්පසු වෙබ් අඩවි url වෙත සම්බන්ධ වන්න (කෙසේ වෙතත් බොහෝ බ්‍රව්සර් ස්වයංක්‍රීයව සිදුවනු ඇතැයි මට විශ්වාසයි ඕනෑම දෙයක් නිවැරදි ආකෘතියෙන් කියවීමට එහි ඉදිරිපස ඇති 'https:' සමඟ පරිවර්තනය කරන්න). මෙය මෙසේ වනු ඇත:

string urlToImage = String.Join("/","websiteUrl", String.Join("/", "folder1", "folder2", "folder3", "item").Replace("//","/"));

ඉහත සඳහන් සියල්ලම හැසිරවිය හැකි පිළිතුරු ඕනෑ තරම් තිබේ, නමුත් මගේ නඩුවේදී, මට එය අවශ්‍ය වූයේ එක් ස්ථානයකට එක් වරක් පමණක් වන අතර ඒ මත දැඩි ලෙස විශ්වාසය තැබීමට අවශ්‍ය නොවනු ඇත. එසේම, මෙහි සිදුවන්නේ කුමක්ද යන්න බැලීම පහසුය.

බලන්න: https://docs.microsoft.com/en-us/dotnet/api/system.string.join?view=netframework-4.8


2

වෙනත් පිළිතුරු වලින් සොයා ගත් පරිදි, නව Uri()හෝ TryCreate()ටික් කළ හැකිය. කෙසේ වෙතත්, යූරි පදනම අවසන් විය යුතු /අතර relative ාතියෙකු සමඟ ආරම්භ විය යුතු නැත /; එසේ නොවුවහොත් එය යූආර්එල් පාදමේ පසුපස කොටස ඉවත් කරයි

මම හිතන්නේ මෙය වඩාත් සුදුසු වන්නේ ව්‍යාප්ති ක්‍රමයක් ලෙස ය, එනම්

public static Uri Append(this Uri uri, string relativePath)
{
    var baseUri = uri.AbsoluteUri.EndsWith('/') ? uri : new Uri(uri.AbsoluteUri + '/');
    var relative = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
    return new Uri(baseUri, relative);
}

සහ එය භාවිතා කිරීමට:

var baseUri = new Uri("http://test.com/test/");
var combinedUri =  baseUri.Append("/Do/Something");

කාර්ය සාධනය සම්බන්ධයෙන් ගත් කල, මෙය අවශ්‍ය ප්‍රමාණයට වඩා වැඩි සම්පත් ප්‍රමාණයක් පරිභෝජනය කරයි, යූරි පන්තිය නිසා විග්‍රහ කිරීම සහ වලංගු කිරීම සිදු කරයි; ඉතා රළු පැතිකඩක් (නිදොස් කිරීම) තත්පර 2 කින් මිලියනයක මෙහෙයුම් සිදු කළේය. මෙය බොහෝ අවස්ථාවන් සඳහා ක්‍රියා කරනු ඇත, කෙසේ වෙතත් වඩා කාර්යක්ෂම වීමට, සෑම දෙයක්ම නූල් ලෙස හැසිරවීම වඩා හොඳය, මෙය මෙහෙයුම් මිලියනයකට මිලි තත්පර 125 ක් ගතවේ. එනම්

public static string Append(this Uri uri, string relativePath)
{
    //avoid the use of Uri as it's not needed, and adds a bit of overhead.
    var absoluteUri = uri.AbsoluteUri; //a calculated property, better cache it
    var baseUri = absoluteUri.EndsWith('/') ? absoluteUri : absoluteUri + '/';
    var relative = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
    return baseUri + relative;
}

ඔබට තවමත් යූආර්අයි එකක් ආපසු ලබා දීමට අවශ්‍ය නම්, මෙහෙයුම් මිලියනයක් සඳහා මිලි තත්පර 600 ක් පමණ ගත වේ.

public static Uri AppendUri(this Uri uri, string relativePath)
{
    //avoid the use of Uri as it's not needed, and adds a bit of overhead.
    var absoluteUri = uri.AbsoluteUri; //a calculated property, better cache it
    var baseUri = absoluteUri.EndsWith('/') ? absoluteUri : absoluteUri + '/';
    var relative = relativePath.StartsWith('/') ? relativePath.Substring(1) : relativePath;
    return new Uri(baseUri + relative);
}

මම හිතනවා මේක උදව් වෙයි කියලා.


2

ඔබට අවශ්‍ය තරම් මාර්ග කොටස් සමඟ කටයුතු කළ හැකි බැවින් මෙය ඔබට වඩාත් නම්‍යශීලී බවක් ලබා දෙනු ඇතැයි මම සිතමි:

public static string UrlCombine(this string baseUrl, params string[] segments)
=> string.Join("/", new[] { baseUrl.TrimEnd('/') }.Concat(segments.Select(s => s.Trim('/'))));

1

භාවිත:

    private Uri UriCombine(string path1, string path2, string path3 = "", string path4 = "")
    {
        string path = System.IO.Path.Combine(path1, path2.TrimStart('\\', '/'), path3.TrimStart('\\', '/'), path4.TrimStart('\\', '/'));
        string url = path.Replace('\\','/');
        return new Uri(url);
    }

හරියටම හැසිරීමේ වාසිය එයට ඇත Path.Combine.


1

මෙන්න මගේ ප්‍රවේශය වන අතර මම එය මා වෙනුවෙන්ම භාවිතා කරමි:

public static string UrlCombine(string part1, string part2)
{
    string newPart1 = string.Empty;
    string newPart2 = string.Empty;
    string seperator = "/";

    // If either part1 or part 2 is empty,
    // we don't need to combine with seperator
    if (string.IsNullOrEmpty(part1) || string.IsNullOrEmpty(part2))
    {
        seperator = string.Empty;
    }

    // If part1 is not empty,
    // remove '/' at last
    if (!string.IsNullOrEmpty(part1))
    {
        newPart1 = part1.TrimEnd('/');
    }

    // If part2 is not empty,
    // remove '/' at first
    if (!string.IsNullOrEmpty(part2))
    {
        newPart2 = part2.TrimStart('/');
    }

    // Now finally combine
    return string.Format("{0}{1}{2}", newPart1, seperator, newPart2);
}

මෙය පිළිගත හැක්කේ ඔබේ නඩුවට පමණි. ඔබගේ කේතය බිඳ දැමිය හැකි අවස්ථා තිබේ. එසේම, ඔබ මාර්ගයේ කොටස් නිසි ලෙස කේතනය කර නැත. හරස් අඩවි ස්ක්‍රිප්ටින් ප්‍රහාරයක් සඳහා මෙය විශාල අවදානමක් විය හැකිය.
2014

මම ඔබේ කරුණු වලට එකඟ වෙමි. කේතය යූආර්එල් කොටස් දෙකක සරල සංයෝජනයක් පමණක් කළ යුතුය.
අමිත් භගත්

1

මෙය භාවිතා කරන්න:

public static class WebPath
{
    public static string Combine(params string[] args)
    {
        var prefixAdjusted = args.Select(x => x.StartsWith("/") && !x.StartsWith("http") ? x.Substring(1) : x);
        return string.Join("/", prefixAdjusted);
    }
}

'වෙබ්පාත්' සමඟ හොඳ ස්පර්ශයක්. :) කේතය අනවශ්‍ය ලෙස ense න වුවත් - මෙය දෙස බලා මට කියන්න අමාරුයි, ඔව්, එය පරිපූර්ණයි. ඒකෙන් මට ඒකක පරීක්ෂණ බලන්න ඕන. සමහර විට ඒ මම විතරයි!
බ්‍රයන් මැකේ

1
x.StartsWith ("/") &&! x.StartsWith ("http") - http පරීක්ෂා කරන්නේ ඇයි? ඔබට ලැබෙන්නේ කුමක්ද?
පෙන්ගුට්

කප්පාදුව http සමඟ ආරම්භ වුවහොත් එය ඉවත් කිරීමට උත්සාහ කිරීමට ඔබට අවශ්‍ය නැත.
මාටින් මර්ෆි

Rian බ්‍රයන්මැක්, මට විශ්වාස නෑ ලයිනර් දෙකක් ඒකක පරීක්ෂණයක් අවශ්‍ය බව නමුත් ඔබ කැමති නම් එකක් ලබා දීමට නිදහස්ව සිටින්න. එය මම පැච් හෝ වෙනත් දෙයක් පිළිගන්නවා වගේ නොවේ, නමුත් යෝජනාව සංස්කරණය කිරීමට නිදහස් වන්න.
මාටින් මර්ෆි

1

Uriඉදිකිරීම්කරු '\' වෙත '/' පෙරළෙන බව මට පෙනී ගියේය. ඒ නිසා ඔබ ද භාවිතා කළ හැකිය Path.Combineසමග, Uriඉදිකිරීමටත්.

 Uri baseUri = new Uri("http://MyUrl.com");
 string path = Path.Combine("Images", "Image.jpg");
 Uri myUri = new Uri(baseUri, path);

1

එය වටින දේ සඳහා, මෙහි දිගු කිරීමේ ක්‍රම කිහිපයක්. පළමුවැන්න මාර්ග ඒකාබද්ධ කරන අතර දෙවැන්න URL වෙත පරාමිතීන් එක් කරයි.

    public static string CombineUrl(this string root, string path, params string[] paths)
    {
        if (string.IsNullOrWhiteSpace(path))
        {
            return root;
        }

        Uri baseUri = new Uri(root);
        Uri combinedPaths = new Uri(baseUri, path);

        foreach (string extendedPath in paths)
        {
           combinedPaths = new Uri(combinedPaths, extendedPath);
        }

        return combinedPaths.AbsoluteUri;
    }

    public static string AddUrlParams(this string url, Dictionary<string, string> parameters)
    {
        if (parameters == null || !parameters.Keys.Any())
        {
            return url;
        }

        var tempUrl = new StringBuilder($"{url}?");
        int count = 0;

        foreach (KeyValuePair<string, string> parameter in parameters)
        {
            if (count > 0)
            {
                tempUrl.Append("&");
            }

            tempUrl.Append($"{WebUtility.UrlEncode(parameter.Key)}={WebUtility.UrlEncode(parameter.Value)}");
            count++;
        }

        return tempUrl.ToString();
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.