Question Path.Combine pour les URL?


Path.Combine est pratique, mais existe-t-il une fonction similaire dans le framework .NET pour URL?

Je cherche une syntaxe comme celle-ci:

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

qui reviendrait:

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


1022
2017-12-16 21:42


origine


Réponses:


Uri a un constructeur qui devrait le faire pour vous: new Uri(Uri baseUri, string relativeUri)

Voici un exemple:

Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");

1004
2017-10-06 19:37



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

Reviendra:

http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx


130
2017-12-16 21:49



Cela peut être une solution appropriée simple:

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



Il y a déjà quelques bonnes réponses ici. Basé sur la suggestion de mdsharpe, voici une méthode d'extension qui peut facilement être utilisée lorsque vous voulez traiter des instances d'Uri:

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('/'))));
    }
}

Et exemple d'utilisation:

var url = new Uri("http://example.com/subpath/").Append("/part1/", "part2").AbsoluteUri;

Cela produira http://example.com/subpath/part1/part2


106
2017-11-03 10:20



Cette question a obtenu de très bonnes réponses, hautement votées!

La réponse de Ryan Cook est proche de ce que je recherche et pourrait ê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 formatage que je ne le suis.

En outre, pour mes cas d'utilisation, la résolution des chemins relatifs n'est pas importante.

La réponse de mdsharp contient également la graine d'une bonne idée, bien que cette implémentation réelle ait besoin de quelques détails supplémentaires pour être complète. C'est une tentative pour l'étoffer (et je l'utilise en production):

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

Ce code passe le test suivant, qui se trouve être dans VB:

<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



Basé sur l'échantillon URL vous avez fourni, je vais supposer que vous voulez combiner les URL relatives à votre site.

Basé sur cette hypothèse, je vais proposer cette solution comme la réponse la plus appropriée à votre question qui était: "Path.Combine est pratique, y at-il un fonction similaire dans le cadre des URL? "

Depuis là est le fonction similaire Dans le cadre pour les URL, je propose la méthode correcte: "VirtualPathUtility.Combine". Voici le lien de référence MSDN: Méthode VirtualPathUtility.Combine

Il y a une mise en garde: je crois 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. var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");).


32
2018-03-28 00:21



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 exception ArgumentException.

J'ai d'abord essayé la nouvelle approche d'Uri (Uri baseUri, string relativeUri), qui a échoué pour moi à cause de celle d'Uri http://www.mediawiki.org/wiki/Special:SpecialPages:

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

entraînera Special: SpecialPages, à cause du côlon après Special qui dénote un schéma.

Donc j'ai finalement dû prendre mdsharpe / Brian MacKays route et l'ai développé un peu plus loin pour travailler avec plusieurs parties d'uri:

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

Usage: CombineUri("http://www.mediawiki.org/", "wiki", "Special:SpecialPages")


27
2017-07-15 08:17