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"

17voto

Alex Punkte 136

Eine einfache Möglichkeit, sie zu kombinieren und sicherzustellen, dass sie immer korrekt sind, ist:

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

14voto

GoldenAge Punkte 2578

Ich denke, das sollte Ihnen mehr Flexibilität geben, da Sie mit so vielen Pfadsegmenten umgehen können, wie Sie wollen:

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

13voto

mtazva Punkte 1007

Witziges Beispiel, Ryan, das mit einem Link zu der Funktion endet. Gut gemacht.

Eine Empfehlung Brian: wenn Sie diesen Code in eine Funktion verpacken, können Sie einen UriBuilder verwenden, um die Basis-URL vor dem TryCreate-Aufruf zu verpacken.

Andernfalls MUSS die Basis-URL das Schema enthalten (wobei der UriBuilder von http:// ausgeht). Nur ein Gedanke:

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

11voto

Ich fand UriBuilder hat sich für diese Art von Dingen sehr bewährt:

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

Siehe UriBuilder-Klasse - MSDN für weitere Konstruktoren und Dokumentation.

10voto

Mahmoud Hanafy Punkte 933

Wie in anderen Antworten festgestellt, sind entweder neue Uri() ou TryCreate() die Zecke machen kann. Die Basis-Uri muss jedoch enden mit / und der Verwandte muss NICHT mit / ; andernfalls wird der hintere Teil der Basis-Url entfernt

Ich denke, dass dies am besten als Erweiterungsmethode durchgeführt wird, d.h.

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

und sie zu nutzen:

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

In Bezug auf die Leistung, verbraucht dies mehr Ressourcen als es braucht, weil der Uri-Klasse, die eine Menge von Parsing und Validierung tut; eine sehr grobe Profiling (Debug) hat eine Million Operationen in etwa 2 Sekunden. Dies wird für die meisten Szenarien zu arbeiten, jedoch effizienter zu sein, ist es besser, alles als Strings zu manipulieren, dauert dies 125 Millisekunden für 1 Million Operationen. D.h..

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

Und wenn Sie trotzdem einen URI zurückgeben wollen, dauert es etwa 600 Millisekunden für 1 Million Operationen.

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

Ich hoffe, das hilft.

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