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.