Path.Combine ist praktisch, aber gibt es im .NET Framework eine ähnliche Funktion für URLs ?
Ich suche nach einer Syntax wie dieser:
Url.Combine("http://MyUrl.com/", "/Images/Image.jpg")
was zurückkehren würde:
"http://MyUrl.com/Images/Image.jpg"
Url.Combine
Methode, die genau das tut.Antworten:
Es gibt einen Kommentar von Todd Menier darüber, dass Flurl a enthält
Url.Combine
.Mehr Details:
Holen Sie sich Flurl.Http auf NuGet :
PM> Install-Package Flurl.Http
Oder holen Sie sich den eigenständigen URL-Builder ohne die HTTP-Funktionen:
PM> Install-Package Flurl
quelle
Flurl
und eine leichte Version bevorzugen würden, github.com/jean-lourenco/UrlCombineUri
hat einen Konstruktor, der dies für Sie tun sollte:new Uri(Uri baseUri, string relativeUri)
Hier ist ein Beispiel:
Hinweis des Editors: Achtung, diese Methode funktioniert nicht wie erwartet. In einigen Fällen kann ein Teil von baseUri abgeschnitten werden. Siehe Kommentare und andere Antworten.
quelle
Dies kann eine entsprechend einfache Lösung sein:
quelle
Sie verwenden
Uri.TryCreate( ... )
:Wird zurückkehren:
quelle
int.TryParse
,DateTime.TryParseExact
) diesen Ausgabeparameter, um die Verwendung in einer if-Anweisung zu vereinfachen. Übrigens müssen Sie die Variable nicht wie in diesem Beispiel von Ryan initialisieren.test.com/mydirectory/
und/helloworld.aspx
führt dazu, dasstest.com/helloworld.aspx
es anscheinend nicht das ist, was Sie wollen.Hier gibt es bereits einige gute Antworten. Basierend auf dem Vorschlag von mdsharpe ist hier eine Erweiterungsmethode, die leicht verwendet werden kann, wenn Sie mit Uri-Instanzen arbeiten möchten:
Und Anwendungsbeispiel:
Dadurch wird http://example.com/subpath/part1/part2 erstellt
quelle
Die Antwort von Ryan Cook entspricht in etwa meiner Suche und ist möglicherweise besser für andere Entwickler geeignet. Es fügt jedoch http: // am Anfang der Zeichenfolge hinzu und formatiert im Allgemeinen etwas mehr als ich.
Für meine Anwendungsfälle ist es auch nicht wichtig, relative Pfade aufzulösen.
Die Antwort von mdsharp enthält auch den Keim einer guten Idee, obwohl für diese tatsächliche Implementierung einige weitere Details erforderlich waren, um vollständig zu sein. Dies ist ein Versuch, es zu konkretisieren (und ich verwende dies in der Produktion):
C #
VB.NET
Dieser Code besteht den folgenden Test, der sich zufällig in VB befindet:
quelle
ArgumentNullException("url1")
wenn das Argument istNothing
? Sorry, nur wählerisch zu sein ;-). Beachten Sie, dass ein Backslash in einem URI nichts zu tun hat (und wenn er vorhanden ist, sollte er nicht gekürzt werden), sodass Sie ihn aus Ihrem TrimXXX entfernen können.Path.Combine funktioniert bei mir nicht, da es Zeichen wie "|" geben kann. in QueryString-Argumenten und damit der URL, was zu einer ArgumentException führt.
Ich habe zuerst den neuen
Uri(Uri baseUri, string relativeUri)
Ansatz ausprobiert , der für mich aufgrund von URIs wiehttp://www.mediawiki.org/wiki/Special:SpecialPages
:führt zu Special: SpecialPages, da der Doppelpunkt danach
Special
ein Schema kennzeichnet.Also musste ich endlich den Weg von mdsharpe / Brian MacKays nehmen und ihn etwas weiterentwickeln, um mit mehreren URI-Teilen zu arbeiten:
Verwendungszweck:
CombineUri("http://www.mediawiki.org/", "wiki", "Special:SpecialPages")
quelle
Basierend auf der von Ihnen angegebenen Beispiel- URL gehe ich davon aus, dass Sie URLs kombinieren möchten, die sich auf Ihre Website beziehen.
Basierend auf dieser Annahme werde ich diese Lösung als die am besten geeignete Antwort auf Ihre Frage vorschlagen: "Path.Combine ist praktisch, gibt es eine ähnliche Funktion im Framework für URLs?"
Da es im Framework für URLs eine ähnliche Funktion gibt, schlage ich die richtige vor: "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 (das heißt, Sie können sie nicht zum Generieren von Links zu einer anderen Website verwenden. Zum Beispiel
var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");
).quelle
Server.MapPath
und zum Kombinieren.quelle
path.Replace(Path.DirectorySeparatorChar, '/');
path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
Ich habe gerade eine kleine Erweiterungsmethode zusammengestellt:
Es kann folgendermaßen verwendet werden:
quelle
Witziges Beispiel, Ryan, um mit einem Link zur Funktion zu enden. Gut gemacht.
Eine Empfehlung Brian: Wenn Sie diesen Code in eine Funktion einschließen, möchten Sie möglicherweise einen UriBuilder verwenden, um die Basis-URL vor dem TryCreate-Aufruf zu umschließen.
Andernfalls MUSS die Basis-URL das Schema enthalten (wobei der UriBuilder http: // annimmt). Nur ein Gedanke:
quelle
Eine einfache Möglichkeit, sie zu kombinieren und sicherzustellen, dass sie immer korrekt sind, ist:
quelle
Das Kombinieren mehrerer Teile einer URL kann etwas schwierig sein. Sie können den Zwei-Parameter-Konstruktor
Uri(baseUri, relativeUri)
oder dieUri.TryCreate()
Utility-Funktion verwenden.In jedem Fall können Sie ein falsches Ergebnis zurückkehren , weil diese Methoden halten auf Kürzen die relativen Teile aus den ersten Parametern am Ende
baseUri
, also von so etwas wiehttp://google.com/some/thing
zuhttp://google.com
.Um mehrere Teile zu einer endgültigen URL kombinieren zu können, können Sie die beiden folgenden Funktionen kopieren:
Den vollständigen Code mit Komponententests zum Nachweis der Verwendung finden Sie unter https://uricombine.codeplex.com/SourceControl/latest#UriCombine/Uri.cs
Ich habe Unit-Tests, um die drei häufigsten Fälle abzudecken:
quelle
Ich fand, dass es
UriBuilder
für so etwas wirklich gut funktioniert hat:Weitere Konstruktoren und Dokumentationen finden Sie unter UriBuilder-Klasse - MSDN .
quelle
Hier ist die Microsoft-Methode (OfficeDev PnP) UrlUtility.Combine :
Quelle: GitHub
quelle
Ich finde Folgendes nützlich und habe die folgenden Funktionen:
params
Parameter für mehrere URL-SegmenteKlasse
Tests
quelle
Meine generische Lösung:
quelle
Ich habe diese Funktion erstellt, die Ihnen das Leben erleichtern wird:
Es funktioniert sowohl für URLs als auch für normale Pfade.
Verwendungszweck:
quelle
Warum nicht einfach das Folgende verwenden.
quelle
[System.IO.Path]::Combine("http://MyUrl.com/","/Images/Image.jpg")
Dies schlägt jedoch mit folgendem Ergebnis fehl :/Images/Image.jpg
. Entfernen Sie die/
aus dem zweiten Unterpfad und es funktioniert:[System.IO.Path]::Combine("http://MyUrl.com/","Images/Image.jpg")
Regeln beim Kombinieren von URLs mit einem URI
Um seltsames Verhalten zu vermeiden, muss eine Regel befolgt werden:
string.Empty
Teilepfads wird auch das relative Verzeichnis aus der URL entfernt!Wenn Sie die oben genannten Regeln befolgen, können Sie URLs mit dem folgenden Code kombinieren. Abhängig von Ihrer Situation können Sie der URL mehrere 'Verzeichnis'-Teile hinzufügen ...
quelle
Wenn Sie in ASP.NET Core (auch in Microsoft.Owin verfügbar) keine Abhängigkeit von Drittanbietern wie Flurl hinzufügen oder eine benutzerdefinierte Erweiterungsmethode erstellen möchten, können Sie diese verwenden, die zum Erstellen
PathString
des URI vorgesehen ist Wege. Sie können dann Ihren vollständigen URI mit einer Kombination aus diesemUri
und erstellenUriBuilder
.In diesem Fall wäre es:
Auf diese Weise erhalten Sie alle Bestandteile, ohne die Trennzeichen in der Basis-URL angeben zu müssen.
PathString
Erfordert leider, dass/
jeder Zeichenfolge vorangestellt wird, da sonst tatsächlich einArgumentException
! Aber zumindest können Sie Ihren URI deterministisch auf eine Weise aufbauen, die leicht auf Einheiten getestet werden kann.quelle
Ich habe also einen anderen Ansatz, ähnlich wie alle, die UriBuilder verwendet haben.
Ich wollte meine BaseUrl (die einen Teil des Pfads enthalten kann - z. B. http://mybaseurl.com/dev/ ) nicht wie javajavajavajavajava aufteilen .
Das folgende Snippet zeigt den Code + Tests.
Achtung: Diese Lösung verkleinert den Host und hängt einen Port an. Wenn dies nicht erwünscht ist, kann man eine Zeichenfolgendarstellung schreiben, indem man beispielsweise die
Uri
Eigenschaft von nutztUriBuilder
.Getestet mit .NET Core 2.1 unter Windows 10.
Warum funktioniert das?
Obwohl
Path.Combine
Backslashes (mindestens unter Windows) zurückgegeben werden, behandelt der UriBuilder diesen Fall im Setter vonPath
.Entnommen aus https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/src/System/UriBuilder.cs (beachten Sie den Aufruf an
string.Replace
)Ist das der beste Ansatz?
Sicherlich ist diese Lösung ziemlich selbstbeschreibend (zumindest meiner Meinung nach). Sie verlassen sich jedoch auf die undokumentierte "Funktion" der .NET-API (zumindest habe ich bei einer schnellen Google-Suche nichts gefunden). Dies kann sich mit einer zukünftigen Version ändern. Bitte behandeln Sie die Methode mit Tests.
Unter https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs (
Path_Get_Set
) gibt es Tests, die prüfen, ob das\
korrekt transformiert wurde.Randnotiz: Man könnte auch
UriBuilder.Uri
direkt mit der Eigenschaft arbeiten, wenn der uri für einenSystem.Uri
ctor verwendet wird.quelle
Für alle, die nach einem Einzeiler suchen und einfach Teile eines Pfads verbinden möchten, ohne eine neue Methode zu erstellen oder auf eine neue Bibliothek zu verweisen oder einen URI-Wert zu erstellen und diesen in einen String umzuwandeln, dann ...
Es ist ziemlich einfach, aber ich sehe nicht, was Sie mehr brauchen. Wenn Sie Angst vor einem doppelten '/' haben, können Sie einfach
.Replace("//", "/")
danach eine machen. Wenn Sie Angst haben, das doppelte '//' in 'https: //' zu ersetzen, führen Sie stattdessen einen Join durch, ersetzen Sie das doppelte '/' und treten Sie dann der Website-URL bei (ich bin mir jedoch ziemlich sicher, dass die meisten Browser dies automatisch tun) konvertieren Sie alles mit 'https:' im Vordergrund, um es im richtigen Format zu lesen. Das würde so aussehen:Hier gibt es viele Antworten, die alle oben genannten Fragen beantworten, aber in meinem Fall brauchte ich sie nur einmal an einem Ort und musste mich nicht stark darauf verlassen. Außerdem ist es sehr einfach zu sehen, was hier los ist.
Siehe: https://docs.microsoft.com/en-us/dotnet/api/system.string.join?view=netframework-4.8
quelle
Verwenden:
Es hat den Vorteil, sich genau so zu verhalten
Path.Combine
.quelle
Hier ist mein Ansatz und ich werde ihn auch für mich selbst verwenden:
quelle
Benutze das:
quelle
Ich habe festgestellt, dass der
Uri
Konstruktor '\' in '/' wechselt. Sie können also auchPath.Combine
mit demUri
Konstruktor verwenden.quelle
Für das, was es wert ist, hier ein paar Erweiterungsmethoden. Der erste kombiniert Pfade und der zweite fügt der URL Parameter hinzu.
quelle
Wie in anderen Antworten zu finden, entweder neu
Uri()
oderTryCreate()
kann das Häkchen machen. Die Basis Uri muss jedoch enden/
und der Verwandte darf NICHT damit beginnen/
; Andernfalls wird der nachfolgende Teil der Basis-URL entferntIch denke, dies wird am besten als Erweiterungsmethode durchgeführt, dh
und um es zu benutzen:
In Bezug auf die Leistung verbraucht dies mehr Ressourcen als benötigt wird, da die Uri-Klasse viel analysiert und validiert. Ein sehr grobes Profiling (Debug) führte eine Million Operationen in ungefähr 2 Sekunden durch. Dies funktioniert in den meisten Szenarien. Um jedoch effizienter zu sein, ist es besser, alles als Zeichenfolgen zu bearbeiten. Dies dauert 125 Millisekunden für 1 Million Operationen. Dh
Wenn Sie dennoch einen URI zurückgeben möchten, dauert es ungefähr 600 Millisekunden für 1 Million Vorgänge.
Ich hoffe das hilft.
quelle
Ich denke, dies sollte Ihnen mehr Flexibilität geben, da Sie mit so vielen Pfadsegmenten umgehen können, wie Sie möchten:
quelle