Path.Combine est pratique, mais existe-t-il une fonction similaire dans le framework .NET pour les URL ?
Je recherche une syntaxe comme celle-ci:
Url.Combine("http://MyUrl.com/", "/Images/Image.jpg")
qui retournerait:
"http://MyUrl.com/Images/Image.jpg"
Url.Combine
méthode qui fait exactement cela.Réponses:
Il y a un commentaire de Todd Menier ci - dessus selon lequel Flurl inclut un
Url.Combine
.Plus de détails:
Obtenez Flurl.Http sur NuGet :
PM> Install-Package Flurl.Http
Ou obtenez le générateur d'URL autonome sans les fonctionnalités HTTP:
PM> Flurl du package d'installation
la source
Flurl
et préférez une version allégée, github.com/jean-lourenco/UrlCombineUri
a un constructeur qui devrait le faire pour vous:new Uri(Uri baseUri, string relativeUri)
Voici un exemple:
Note de l'éditeur: Attention, cette méthode ne fonctionne pas comme prévu. Il peut couper une partie de baseUri dans certains cas. Voir les commentaires et autres réponses.
la source
Cela peut être une solution suffisamment simple:
la source
Vous utilisez
Uri.TryCreate( ... )
:Reviendra:
la source
int.TryParse
,DateTime.TryParseExact
) ont ce paramètre de sortie pour faciliter leur utilisation dans une instruction if. Btw, vous n'avez pas à initialiser la variable comme Ryan l'a fait dans cet exemple.test.com/mydirectory/
et/helloworld.aspx
se traduira partest.com/helloworld.aspx
ce qui n'est apparemment pas ce que vous voulez.Il y a déjà d'excellentes réponses ici. Basé sur la suggestion de mdsharpe, voici une méthode d'extension qui peut facilement être utilisée lorsque vous souhaitez gérer des instances Uri:
Et exemple d'utilisation:
Cela produira http://example.com/subpath/part1/part2
la source
La réponse de Ryan Cook est proche de ce que je recherche et peut être plus appropriée pour d'autres développeurs. Cependant, il ajoute http: // au début de la chaîne et en général, il fait un peu plus de mise en forme que je ne le suis.
De plus, pour mes cas d'utilisation, la résolution de chemins relatifs n'est pas importante.
La réponse de mdsharp contient également le germe d'une bonne idée, bien que cette implémentation réelle ait besoin de quelques détails supplémentaires pour être complète. Ceci est une tentative de l'étoffer (et je l'utilise en production):
C #
VB.NET
Ce code passe le test suivant, qui se trouve être en VB:
la source
ArgumentNullException("url1")
si l'argument estNothing
? Désolé, juste difficile ;-). Notez qu'une barre oblique inverse n'a rien à voir dans un URI (et si elle est là, elle ne doit pas être coupée), vous pouvez donc la supprimer de votre TrimXXX.Path.Combine ne fonctionne pas pour moi car il peut y avoir des caractères comme "|" dans les arguments QueryString et donc l'URL, ce qui entraînera une ArgumentException.
J'ai d'abord essayé la nouvelle
Uri(Uri baseUri, string relativeUri)
approche, qui a échoué pour moi à cause d'URI commehttp://www.mediawiki.org/wiki/Special:SpecialPages
:se traduira par Special: SpecialPages, à cause des deux points après
Special
cela dénote un schéma.J'ai donc finalement dû prendre la route mdsharpe / Brian MacKays et la développer un peu plus pour travailler avec plusieurs parties URI:
Usage:
CombineUri("http://www.mediawiki.org/", "wiki", "Special:SpecialPages")
la source
Basé sur l'exemple d' URL vous avez fourni, je suppose que vous souhaitez combiner des URL relatives à votre site.
Sur la base de cette hypothèse, je proposerai cette solution comme la réponse la plus appropriée à votre question qui était: "Path.Combine est pratique, y a-t-il une fonction similaire dans le cadre des URL?"
Puisqu'il y a une fonction similaire dans le cadre des URL, je propose que la bonne soit: "VirtualPathUtility.Combine". Voici le lien de référence MSDN: VirtualPathUtility.Combine, méthode
Il y a une mise en garde: je pense que cela ne fonctionne que pour les URL relatives à votre site (c'est-à-dire que vous ne pouvez pas l'utiliser pour générer des liens vers un autre site Web. Par exemple,
var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");
).la source
Server.MapPath
et une combinaison.la source
path.Replace(Path.DirectorySeparatorChar, '/');
path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
Je viens de mettre en place une petite méthode d'extension:
Il peut être utilisé comme ceci:
la source
Exemple plein d'esprit, Ryan, pour terminer avec un lien vers la fonction. Bien joué.
Une recommandation Brian: si vous encapsulez ce code dans une fonction, vous souhaiterez peut-être utiliser un UriBuilder pour encapsuler l'URL de base avant l'appel TryCreate.
Sinon, l'URL de base DOIT inclure le schéma (où UriBuilder supposera http: //). Juste une pensée:
la source
Un moyen simple de les combiner et de vous assurer qu'elles sont toujours correctes est:
la source
La combinaison de plusieurs parties d'une URL peut être un peu délicate. Vous pouvez utiliser le constructeur à deux paramètres
Uri(baseUri, relativeUri)
ou utiliser laUri.TryCreate()
fonction utilitaire.Dans les deux cas, vous pourriez finir par renvoyer un résultat incorrect car ces méthodes continuent de tronquer les parties relatives du premier paramètre
baseUri
, c'est-à-dire de quelque chose commehttp://google.com/some/thing
àhttp://google.com
.Pour pouvoir combiner plusieurs parties en une URL finale, vous pouvez copier les deux fonctions ci-dessous:
Le code complet avec des tests unitaires pour démontrer l'utilisation peut être trouvé à https://uricombine.codeplex.com/SourceControl/latest#UriCombine/Uri.cs
J'ai des tests unitaires pour couvrir les trois cas les plus courants:
la source
J'ai trouvé que ça
UriBuilder
fonctionnait très bien pour ce genre de chose:Voir Classe UriBuilder - MSDN pour plus de constructeurs et de documentation.
la source
Voici la méthode UrlUtility.Combine de Microsoft (OfficeDev PnP) :
Source: GitHub
la source
Je trouve les éléments suivants utiles et présente les caractéristiques suivantes:
params
paramètres pour plusieurs segments d'URLClasse
Les tests
la source
Ma solution générique:
la source
J'ai créé cette fonction qui vous facilitera la vie:
Cela fonctionne pour les URL ainsi que pour les chemins normaux.
Usage:
la source
Pourquoi ne pas simplement utiliser ce qui suit.
la source
[System.IO.Path]::Combine("http://MyUrl.com/","/Images/Image.jpg")
mais cela échoue avec raison:/Images/Image.jpg
. Retirez le/
du deuxième sous-chemin et cela fonctionne:[System.IO.Path]::Combine("http://MyUrl.com/","Images/Image.jpg")
Règles lors de la combinaison d'URL avec un URI
Pour éviter un comportement étrange, il y a une règle à suivre:
string.Empty
chemin de partie supprimera également le répertoire relatif de l'URL!Si vous suivez les règles ci-dessus, vous pouvez combiner des URL avec le code ci-dessous. Selon votre situation, vous pouvez ajouter plusieurs parties de «répertoire» à l'URL ...
la source
Si vous ne souhaitez pas ajouter une dépendance tierce telle que Flurl ou créer une méthode d'extension personnalisée, dans ASP.NET Core (également disponible dans Microsoft.Owin), vous pouvez utiliser
PathString
ce qui est destiné à la création d'URI chemins. Vous pouvez ensuite créer votre URI complet en utilisant une combinaison de ceci,Uri
etUriBuilder
.Dans ce cas, ce serait:
Cela vous donne toutes les parties constitutives sans avoir à spécifier les séparateurs dans l'URL de base. Malheureusement,
PathString
requiert que/
soit ajouté à chaque chaîne sinon il lance en fait unArgumentException
! Mais au moins, vous pouvez créer votre URI de manière déterministe d'une manière qui est facilement testable par unité.la source
J'ai donc une autre approche, similaire à tous ceux qui ont utilisé UriBuilder.
Je ne voulais pas diviser ma BaseUrl (qui peut contenir une partie du chemin - par exemple http://mybaseurl.com/dev/ ) comme javajavajavajavajava .
L'extrait suivant montre le code + tests.
Attention: cette solution met en minuscule l'hôte et ajoute un port. Si cela n'est pas souhaité, on peut écrire une représentation sous forme de chaîne en utilisant par exemple la
Uri
propriété deUriBuilder
.Testé avec .NET Core 2.1 sur Windows 10.
Pourquoi ça marche?
Même s'il
Path.Combine
renverra des barres obliques inverses (au moins sur Windows), l'UriBuilder gère ce cas dans le Setter dePath
.Tiré de https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/src/System/UriBuilder.cs (attention à l'appel à
string.Replace
)Est-ce la meilleure approche?
Certes, cette solution est assez auto-descriptive (du moins à mon avis). Mais vous comptez sur la "fonctionnalité" non documentée (au moins, je n'ai rien trouvé avec une recherche rapide sur Google) de l'API .NET. Cela peut changer avec une future version, veuillez donc couvrir la méthode avec des tests.
Il existe des tests dans https://github.com/dotnet/corefx/blob/master/src/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs (
Path_Get_Set
) qui vérifient si le\
est correctement transformé.Note latérale: On pourrait également travailler
UriBuilder.Uri
directement avec la propriété, si l'uri sera utilisé pour unSystem.Uri
ctor.la source
Pour tous ceux qui recherchent une ligne et veulent simplement joindre des parties d'un chemin sans créer de nouvelle méthode ou référencer une nouvelle bibliothèque ou construire une valeur URI et la convertir en chaîne, puis ...
C'est assez basique, mais je ne vois pas de quoi vous avez besoin de plus. Si vous avez peur de doubler '/', vous pouvez simplement faire un
.Replace("//", "/")
après. Si vous avez peur de remplacer le "//" doublé dans "https: //", puis effectuez une jointure, remplacez le "/" doublé, puis rejoignez l'URL du site Web (mais je suis pratiquement sûr que la plupart des navigateurs le feront automatiquement convertir quoi que ce soit avec 'https:' à l'avant pour lire au format correct). Cela ressemblerait à ceci:Il y a beaucoup de réponses ici qui gèreront tout ce qui précède, mais dans mon cas, je n'en avais besoin qu'une seule fois dans un seul endroit et je n'aurais pas besoin de m'y fier fortement. De plus, il est vraiment facile de voir ce qui se passe ici.
Voir: https://docs.microsoft.com/en-us/dotnet/api/system.string.join?view=netframework-4.8
la source
Utilisation:
Il a l'avantage de se comporter exactement comme
Path.Combine
.la source
Voici mon approche et je vais l'utiliser pour moi aussi:
la source
Utilisez ceci:
la source
J'ai trouvé que le
Uri
constructeur retourne «\» dans «/». Vous pouvez donc également utiliserPath.Combine
, avec leUri
constructeur.la source
Pour ce que ça vaut, voici quelques méthodes d'extension. Le premier combinera les chemins et le second ajoute des paramètres à l'URL.
la source
Comme on le trouve dans d'autres réponses, soit nouveau
Uri()
ouTryCreate()
peut faire le tick. Cependant, l'Uri de base doit se terminer par/
et le parent ne doit PAS commencer par/
; sinon il supprimera la partie arrière de l'URL de baseJe pense que c'est mieux de le faire comme méthode d'extension, c'est-à-dire
et pour l'utiliser:
En termes de performances, cela consomme plus de ressources qu'il n'en a besoin, en raison de la classe Uri qui effectue beaucoup d'analyse et de validation; un profilage très grossier (Debug) a fait un million d'opérations en environ 2 secondes. Cela fonctionnera pour la plupart des scénarios, mais pour être plus efficace, il est préférable de tout manipuler sous forme de chaînes, cela prend 125 millisecondes pour 1 million d'opérations. C'est à dire
Et si vous souhaitez toujours renvoyer un URI, cela prend environ 600 millisecondes pour 1 million d'opérations.
J'espère que ça aide.
la source
Je pense que cela devrait vous donner plus de flexibilité car vous pouvez traiter autant de segments de chemin que vous le souhaitez:
la source