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"

1352voto

Joel Beckham Punkte 17560

Uri hat einen Konstruktor, der dies für Sie tun sollte: new Uri(Uri baseUri, string relativeUri)

Hier ist ein Beispiel:

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

Anmerkung des Herausgebers: Vorsicht, diese Methode funktioniert nicht wie erwartet. Sie kann in einigen Fällen einen Teil der baseUri abschneiden. Siehe Kommentare und andere Antworten.

230voto

Matthew Sharpe Punkte 3409

Dies könnte eine einfache Lösung sein:

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

192voto

Hier gibt es bereits einige gute Antworten. Basierend auf mdsharpe Vorschlag, hier ist eine Erweiterung Methode, die leicht verwendet werden kann, wenn Sie mit Uri-Instanzen umgehen wollen:

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

Und Anwendungsbeispiel:

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

Dies führt zu http://example.com/subpath/part1/part2

Wenn Sie statt mit Uris mit Strings arbeiten wollen, führt auch das Folgende zum gleichen Ergebnis, passen Sie es einfach an Ihre Bedürfnisse an:

public string JoinUriSegments(string uri, params string[] segments)
{
    if (string.IsNullOrWhiteSpace(uri))
        return null;

    if (segments == null || segments.Length == 0)
        return uri;

    return segments.Aggregate(uri, (current, segment) => $"{current.TrimEnd('/')}/{segment.TrimStart('/')}");
}

var uri = JoinUriSegements("http://example.com/subpath/", "/part1/", "part2");

158voto

Ryan Cook Punkte 9105

Sie verwenden 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);
}

Wird zurückkehren:

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

143voto

Michael Freidgeim Punkte 23629

Dort ist ein Kommentar von Todd Menier oben dass Flurl enthält eine Url.Combine .

Weitere Einzelheiten:

Url.Combine ist im Grunde eine Path.Combine für URLs, die ein und nur ein und nur ein Trennzeichen zwischen den Teilen:

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" 

Siehe Flurl.Http auf NuGet :

PM> Install-Paket Flurl.Http

Oder Holen Sie sich den eigenständigen URL-Builder ohne die HTTP-Funktionen:

PM> Install-Paket Flurl

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