Reemplazar host en Uri


85

¿Cuál es la mejor forma de reemplazar la parte de host de un Uri usando .NET?

Es decir:

string ReplaceHost(string original, string newHostName);
//...
string s = ReplaceHost("http://oldhostname/index.html", "newhostname");
Assert.AreEqual("http://newhostname/index.html", s);
//...
string s = ReplaceHost("http://user:pass@oldhostname/index.html", "newhostname");
Assert.AreEqual("http://user:pass@newhostname/index.html", s);
//...
string s = ReplaceHost("ftp://user:pass@oldhostname", "newhostname");
Assert.AreEqual("ftp://user:pass@newhostname", s);
//etc.

System.Uri no parece ayudar mucho.

Respuestas:


147

System.UriBuilder es lo que buscas ...

string ReplaceHost(string original, string newHostName) {
    var builder = new UriBuilder(original);
    builder.Host = newHostName;
    return builder.Uri.ToString();
}

Gracias, eso era exactamente lo que estaba buscando.
— Rasmus Faber

1
Hubiera recomendado la clase de Uri, pero me hubiera equivocado. Buena respuesta.
— Jonathan C Dickinson

Funciona muy bien, solo tenga en cuenta que si lee la propiedad de consulta, se antepone un?, Y si establece la propiedad de consulta con una cadena que comienza con?, ¿Otra? se antepondrá.
— Dave

Tendrá que manejar los puertos, si están especificados en original o nuevo.
— Realidad subjetiva

42

Como dice @Ishmael, puede usar System.UriBuilder. He aquí un ejemplo:

// the URI for which you want to change the host name
var oldUri = Request.Url;

// create a new UriBuilder, which copies all fragments of the source URI
var newUriBuilder = new UriBuilder(oldUri);

// set the new host (you can set other properties too)
newUriBuilder.Host = "newhost.com";

// get a Uri instance from the UriBuilder
var newUri = newUriBuilder.Uri;

3
Sospecho que podría ser mejor obtener la Uriinstancia llamando en newUriBuilder.Urilugar de formatearla y analizarla.
— Sam

@Sam tienes razón, la Uripropiedad es una opción mucho mejor. Gracias. Actualizado.
— Drew Noakes

Cuidado con la .Urillamada. Si tiene algo UriBuilderque no se traduce en un Uri válido, arrojará. Entonces, por ejemplo, si necesita un host comodín *, puede configurarlo .Host, pero si lo llama .Uriarrojará. Si lo llama UriBuilder.ToString(), devolverá el Uri con el comodín en su lugar.
— CubanX
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.