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.

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

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;

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.