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.

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();
}

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;

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.