Ersetzen Sie den Host in Uri

84

Was ist der schönste Weg, um den Host-Teil eines Uri mit .NET zu ersetzen?

Dh:

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 scheint nicht viel zu helfen.

Rasmus Faber
quelle

Antworten:

144

System.UriBuilder ist das, wonach Sie suchen ...

string ReplaceHost(string original, string newHostName) {
    var builder = new UriBuilder(original);
    builder.Host = newHostName;
    return builder.Uri.ToString();
}
Ishmael
quelle
Danke, genau das habe ich gesucht.
Rasmus Faber
1
Ich hätte die Uri-Klasse empfohlen, aber ich hätte mich geirrt. Gute Antwort.
Jonathan C Dickinson
Funktioniert hervorragend. Beachten Sie jedoch, dass beim Lesen der Query-Eigenschaft ein? Vorangestellt wird und wenn Sie die Query-Eigenschaft mit einer Zeichenfolge festlegen, die mit? Beginnt, eine andere? wird vorangestellt.
Dave
Sie müssen mit Ports umgehen, wenn diese entweder im Original oder im Neuzustand angegeben sind.
Subjektive Realität
42

Wie @Ishmael sagt, können Sie System.UriBuilder verwenden. Hier ist ein Beispiel:

// 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
quelle
3
Ich vermute, es ist besser, die UriInstanz durch Aufrufen zu erhalten , newUriBuilder.Urials sie zu formatieren und zu analysieren.
Sam
@ Sam Sie haben Recht, die UriEigenschaft ist eine viel bessere Option. Vielen Dank. Aktualisiert.
Drew Noakes
Vorsicht vor dem .UriAnruf. Wenn Sie etwas darin haben UriBuilder, das nicht zu einem gültigen Uri übersetzt wird, wird es werfen. Wenn Sie beispielsweise einen Platzhalter-Host benötigen *, können Sie diesen einstellen .Host, aber wenn Sie ihn aufrufen .Uri, wird er ausgelöst. Wenn Sie anrufen UriBuilder.ToString(), wird der Uri mit dem Platzhalter zurückgegeben.
CubanX