Substituir host em Uri


88

Qual é a melhor maneira de substituir a parte do host de um Uri usando o .NET?

Ie:

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 não parece ajudar muito.

Respostas:


149

System.UriBuilder é o que você procura ...

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

1
Eu teria recomendado a aula de Uri, mas estaria errado. Boa resposta.
Jonathan C Dickinson

Funciona muito bem, apenas observe que se você ler a propriedade Query, ela é precedida por um?, E se você definir a propriedade Query com uma string começando com?, Outro? será prefixado.
Dave

Você terá que lidar com as portas, se elas forem especificadas no original ou no novo.
Realidade Subjetiva de

43

Como @Ishmael diz, você pode usar System.UriBuilder. Aqui está um exemplo:

// 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
Suspeito que seja melhor obter a Uriinstância chamando em newUriBuilder.Urivez de formatá-la e analisá-la.
Sam

@Sam você está certo, o Uriimóvel é uma opção muito melhor. Obrigado. Atualizada.
Drew Noakes em

Cuidado com a .Uriligação. Se você tiver algo UriBuilderque não se traduza em um Uri válido, ele será lançado. Por exemplo, se você precisa de um host curinga, *pode defini .Host-lo, mas se você chamá- .Urilo, ele será lançado. Se você ligar, UriBuilder.ToString()ele retornará o Uri com o caractere curinga no lugar.
CubanX
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.