Frage Pfad.Kombinieren für URLs?


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

Ich suche eine Syntax wie diese:

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

was zurückkommen würde:

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


1022
2017-12-16 21:42


Ursprung


Antworten:


Uri hat einen Konstruktor, der das 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");

1004
2017-10-06 19:37



Sie nutzen 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


130
2017-12-16 21:49



Dies kann eine angemessen 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);
}

124
2017-09-25 10:29



Hier gibt es schon einige gute Antworten. Basierend auf dem Vorschlag von mdsharpe gibt es hier eine Erweiterungsmethode, die einfach verwendet werden kann, wenn Sie mit Uri-Instanzen arbeiten möchten:

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 wird produzieren http://example.com/subpath/part1/part2


106
2017-11-03 10:20



Diese Frage hat einige sehr gute Antworten erhalten!

Ryan Cooks Antwort ist nahe an dem, was ich möchte und könnte für andere Entwickler geeigneter sein. Es fügt jedoch http: // an den Anfang des Strings und im Allgemeinen ein bisschen mehr Formatierung als ich danach bin.

Auch für meine Anwendungsfälle ist das Auflösen relativer Pfade nicht wichtig.

Die Antwort von mdsharp enthält auch den Keim einer guten Idee, obwohl diese tatsächliche Implementierung noch einige Details benötigt, um vollständig zu sein. Dies ist ein Versuch, es zu konkretisieren (und ich verwende das 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 ist:

<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

77
2018-05-10 21:53



Basierend auf der Probe URL Ich nehme an, Sie möchten URLs kombinieren, die sich auf Ihre Website beziehen.

Basierend auf dieser Annahme werde ich diese Lösung als die passendste Antwort auf Ihre Frage vorschlagen, die war: "Path.Combine ist praktisch, gibt es eine ähnliche Funktion im Rahmen für URLs? "

Da ist das ein ähnliche Funktion Im Rahmen für URLs, die ich vorschlagen, ist die richtige: "VirtualPathUtility.Combine" -Methode. Hier ist der MSDN Referenzlink: VirtualPathUtility.Combine-Methode

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


32
2018-03-28 00:21



Path.Combine funktioniert nicht für mich, da Zeichen wie "|" in QueryString-Argumenten und daher die URL, was zu einer ArgumentException führt.

Ich habe zuerst den neuen Uri-Ansatz (Uri baseUri, string relativeUri) ausprobiert, der für mich aufgrund von Uri fehlgeschlagen ist http://www.mediawiki.org/wiki/Special:SpecialPages:

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

führt zu Special: SpecialPages, wegen des Doppelpunkts nach Special, der ein Schema bezeichnet.

Also musste ich schließlich mdsharpe / Brian MacKays route nehmen und entwickelte es ein bisschen weiter, um mit mehreren uri Teilen zu arbeiten:

public static string CombineUri(params string[] uriParts)
{
    string uri = string.Empty;
    if (uriParts != null && uriParts.Count() > 0)
    {
        char[] trims = new char[] { '\\', '/' };
        uri = (uriParts[0] ?? string.Empty).TrimEnd(trims);
        for (int i = 1; i < uriParts.Count(); 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")


27
2017-07-15 08:17



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

21
2018-01-11 21:41



Ich habe nur eine kleine Extension-Methode 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('/');
        }

kann so verwendet werden:

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

14
2017-11-25 08:43



Witziges Beispiel, Ryan, um mit einem Link zu der Funktion zu enden. Gut gemacht.

Eine Empfehlung Brian: Wenn Sie diesen Code in eine Funktion einfügen, können Sie die Basis-URL vor dem TryCreate-Aufruf mit einem UriBuilder umbrechen.

Andernfalls muss die Basis-URL das Schema enthalten (wobei der UriBuilder von http: // ausgehen soll). 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");
}

11
2017-07-30 15:08



Die Kombination mehrerer Teile einer URL könnte etwas knifflig sein. Sie können den 2-Parameter-Konstruktor verwenden Uri(baseUri, relativeUri)oder Sie können verwenden Uri.TryCreate() Dienstprogrammfunktion. In beiden Fällen geben Sie möglicherweise ein falsches Ergebnis zurück, da diese Methoden weiterhin die relativen Teile des ersten Parameters abschneiden baseUri, d.h. von etwas ähnlichem http://google.com/some/thing zu http://google.com

Um mehrere Teile zu einer endgültigen URL kombinieren zu können, können Sie die folgenden 2 Funktionen kopieren:

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

Vollständiger Code mit Komponententests zur Demonstration der Verwendung finden Sie unter https://uricombine.codeplex.com/SourceControl/latest#UriCombine/Uri.cs

Ich habe Unit-Tests, um die 3 häufigsten Fälle abzudecken: enter image description here


8
2018-04-30 22:21