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.

Rasmus Faber
fuente

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();
}
Ismael
fuente
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;
Dibujó Noakes
fuente
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