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.