Remplacer l'hôte dans Uri

85

Quelle est la meilleure façon de remplacer la partie hôte d'un Uri à l'aide de .NET?

C'est à dire:

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 ne semble pas beaucoup aider.

Rasmus Faber
la source

Réponses:

147

System.UriBuilder est ce que vous recherchez ...

string ReplaceHost(string original, string newHostName) {
    var builder = new UriBuilder(original);
    builder.Host = newHostName;
    return builder.Uri.ToString();
}
Ismaël
la source
Merci, c'était exactement ce que je cherchais.
Rasmus Faber
1
J'aurais recommandé la classe Uri, mais j'aurais eu tort. Bonne réponse.
Jonathan C Dickinson le
Fonctionne très bien, notez simplement que si vous lisez la propriété Query, elle est précédée d'un?, Et si vous définissez la propriété Query avec une chaîne commençant par?, Une autre? sera ajouté au début.
Dave le
Vous devrez gérer les ports, s'ils sont spécifiés dans l'original ou dans le nouveau.
Réalité subjective du
42

Comme le dit @Ishmael, vous pouvez utiliser System.UriBuilder. Voici un exemple:

// 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;
Drew Noakes
la source
3
Je soupçonne qu'il serait peut-être préférable d'obtenir l' Uriinstance en l'appelant newUriBuilder.Uriplutôt qu'en la formatant et en l'analysant.
Sam
@Sam vous avez raison, la Uripropriété est une bien meilleure option. Merci. Mis à jour.
Drew Noakes le
Attention à l' .Uriappel. Si vous avez quelque chose en cela UriBuilderqui ne se traduit pas par un Uri valide, il lancera. Ainsi, par exemple, si vous avez besoin d'un hôte générique, *vous pouvez le définir .Host, mais si vous l'appelez, .Uriil le lancera. Si vous appelez, UriBuilder.ToString()il renverra l'URI avec le caractère générique en place.
CubanX