1533 Stimmen

Path.Combine für URLs?

Pfad.Kombinieren ist praktisch, aber gibt es eine ähnliche Funktion im .NET-Framework für URLs ?

Ich bin auf der Suche nach einer Syntax wie dieser:

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

die zurückkehren würde:

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

112voto

Brian MacKay Punkte 29566

Die Antwort von Ryan Cook kommt dem, was ich suche, sehr nahe und ist vielleicht für andere Entwickler besser geeignet. Sie fügt jedoch http:// an den Anfang der Zeichenkette an und macht im Allgemeinen etwas mehr Formatierung als ich möchte.

Außerdem ist die Auflösung relativer Pfade für meine Anwendungsfälle nicht wichtig.

Die Antwort von mdsharp enthält ebenfalls den Keim einer guten Idee, auch wenn die tatsächliche Umsetzung noch ein paar Details benötigt, um vollständig zu sein. Dies ist ein Versuch, sie zu vervollständigen (und ich verwende sie in der Produktion):

C#

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

Dieser Code besteht den folgenden Test, der zufällig in 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

50voto

Mike Fuchs Punkte 11731

Path.Combine funktioniert bei mir nicht, weil in den QueryString-Argumenten und damit in der URL Zeichen wie "|" vorkommen können, was zu einer ArgumentException führt.

Ich habe zuerst die neue Uri(Uri baseUri, string relativeUri) Ansatz, der bei mir aufgrund von URIs wie http://www.mediawiki.org/wiki/Special:SpecialPages :

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

ergibt Special:SpecialPages, wegen des Doppelpunkts nach Special die ein Schema bezeichnet.

Also musste ich schließlich den Weg von mdsharpe/Brian MacKay einschlagen und ihn ein wenig weiterentwickeln, um mit mehreren URI-Teilen arbeiten zu können:

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

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

35voto

Auf der Grundlage der Stichprobe URL die Sie angegeben haben, gehe ich davon aus, dass Sie URLs kombinieren wollen, die relativ zu Ihrer Website sind.

Ausgehend von dieser Annahme schlage ich diese Lösung als angemessenste Antwort auf Ihre Frage vor, die lautete: "Path.Combine ist praktisch, gibt es eine ähnliche Funktion in den Rahmen für URLs?"

Da es sich um eine ähnliche Funktion in der Rahmenrichtlinie für URLs schlage ich vor, die richtige ist: "VirtualPathUtility.Combine" Methode. Hier ist der MSDN-Referenzlink: VirtualPathUtility.Combine Methode

Es gibt eine Einschränkung: Ich glaube, dies funktioniert nur für URLs, die sich auf Ihre Website beziehen (d. h. Sie können damit keine Links zu einer anderen Website erzeugen). Zum Beispiel, var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets"); ).

28voto

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

19voto

urza Punkte 187

Ich habe gerade eine kleine Erweiterungsmethode zusammengestellt:

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('/');
        }

Sie kann wie folgt verwendet werden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X