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

5voto

TheGeneral Punkte 75244

Ich finde das folgende nützlich und hat die folgenden Eigenschaften:

  • Wirft bei Null oder Leerzeichen
  • Nimmt mehrere params Parameter für mehrere Url-Segmente
  • wirft bei null oder leer

Klasse

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

Tests

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

5voto

Nick N. Punkte 11730

Ein einfacher Einzeiler:

public static string Combine(this string uri1, string uri2) => $"{uri1.TrimEnd('/')}/{uri2.TrimStart('/')}";

Inspiriert durch die Antwort von @Matt Sharpe.

4voto

Hier ist die Methode von Microsoft (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);
    }

Source : GitHub

4voto

user2368285 Punkte 57

// Ich habe alle obigen Beispiele gelesen und als Ergebnis meine eigene erstellt:

static string UrlCombine(params string[] items)
{
    if (items?.Any() != true)
    {
        return string.Empty;
    }

    return string.Join("/", items.Where(u => !string.IsNullOrWhiteSpace(u)).Select(u => u.Trim('/', '\\')));
}

// Verwendung

UrlCombine("https://microsoft.com","en-us")

4voto

Neo Punkte 3585

Wenn Sie keine Drittanbieter-Abhängigkeit wie Flurl hinzufügen oder eine benutzerdefinierte Erweiterungsmethode erstellen möchten, können Sie in ASP.NET Core (auch in Microsoft.Owin verfügbar) PathString die für den Aufbau von URI-Pfaden bestimmt ist. Sie können dann Ihren vollständigen URI mit einer Kombination aus diesen erstellen, Uri y UriBuilder .

In diesem Fall wäre dies der Fall:

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

So erhalten Sie alle Bestandteile, ohne dass Sie die Trennzeichen in der Basis-URL angeben müssen. Leider, PathString erfordert, dass / wird jeder Zeichenkette vorangestellt, andernfalls kommt es zu einem ArgumentException ! Aber zumindest können Sie Ihre URI auf deterministische Art und Weise aufbauen, so dass sie leicht unit-testbar ist.

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