Pregunta Path.Combine para URLs?


Path.Combine es útil, pero ¿hay una función similar en el marco de .NET para URLs?

Estoy buscando una sintaxis como esta:

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

que regresaría:

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


1022
2017-12-16 21:42


origen


Respuestas:


Uri tiene un constructor que debería hacer esto por usted: new Uri(Uri baseUri, string relativeUri)

Aquí hay un ejemplo:

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

1004
2017-10-06 19:37



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

Regresará:

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


130
2017-12-16 21:49



Esta puede ser una solución adecuadamente 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



Ya hay algunas buenas respuestas aquí. En función de la sugerencia de mdsharpe, este es un método de extensión que se puede usar fácilmente cuando desee tratar instancias de 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('/'))));
    }
}

Y ejemplo de uso:

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

Esto producirá http://example.com/subpath/part1/part2


106
2017-11-03 10:20



¡Esta pregunta obtuvo respuestas excelentes y altamente votadas!

La respuesta de Ryan Cook está cerca de lo que busco y puede ser más apropiada para otros desarrolladores. Sin embargo, agrega http: // al comienzo de la cadena y, en general, formatea un poco más de lo que estoy buscando.

Además, para mis casos de uso, la resolución de rutas relativas no es importante.

La respuesta de mdsharp también contiene la semilla de una buena idea, aunque esa implementación real necesitaba algunos detalles más para completarse. Este es un intento de desarrollarlo (y estoy usando esto en producción):

DO#

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

Este código pasa la siguiente prueba, que sucede que está en 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



Basado en la muestra URL proporcionado, supongo que quiere combinar las URL que son relativas a su sitio.

Con base en esta suposición, propondré esta solución como la respuesta más adecuada a su pregunta que fue: "Path.Combine es útil, ¿hay alguna función similar en el marco de las URL? "

Dado que allí hay un función similar en el marco de las URL que propongo, el correcto es: método "VirtualPathUtility.Combine". Aquí está el enlace de referencia de MSDN: Método VirtualPathUtility.Combine

Hay una advertencia: creo que esto solo funciona para las URL relacionadas con su sitio (es decir, no puede usarlo para generar enlaces a otro sitio web. Por ejemplo, var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");)


32
2018-03-28 00:21



Path.Combine no funciona para mí porque puede haber caracteres como "|" en los argumentos QueryString y, por lo tanto, en la Url, que dará como resultado una ArgumentException.

Primero probé el nuevo enfoque de Uri (Uri baseUri, string relativeUri), que falló para mí debido a Uri's like http://www.mediawiki.org/wiki/Special:SpecialPages:

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

dará como resultado Special: SpecialPages, debido a los dos puntos después de Special que denota un esquema.

Así que finalmente tuve que tomar la ruta de mdsharpe / Brian MacKays y la desarrollé un poco más para trabajar con múltiples partes de 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;
}

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


27
2017-07-15 08:17