2009-01-26 18 views
67

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

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:[email protected]/index.html", "newhostname"); 
Assert.AreEqual("http://user:[email protected]/index.html", s); 
//... 
string s = ReplaceHost("ftp://user:[email protected]", "newhostname"); 
Assert.AreEqual("ftp://user:[email protected]", s); 
//etc. 

System.Uri no parece ayudar mucho.

Respuesta

103

System.UriBuilder es lo que está después ...

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

Gracias, eso es exactamente lo que estaba buscando. –

+0

Hubiera recomendado la clase Uri, pero me habría equivocado. Buena respuesta. –

+0

Funciona muy bien, solo tenga en cuenta que si lee la propiedad Query, se antepone con un?, Y si establece la propiedad Query con una cadena que comienza con?, Otro? será antepuesto – Dave

41

Como dice @Ishmael, puede utilizar System.UriBuilder. Aquí hay 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; 
+2

Sospecho que podría ser mejor obtener la instancia 'Uri' llamando a' newUriBuilder.Uri' en lugar de formatearla y analizarla. – Sam

+0

@Sam tiene razón, la propiedad ['Uri'] (http://msdn.microsoft.com/en-us/library/system.uribuilder.uri.aspx) es una opción mucho mejor. Gracias. Actualizado. –