Zastąp hosta w Uri


85

Jaki jest najładniejszy sposób zastąpienia części hosta Uri przy użyciu platformy .NET?

To znaczy:

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 nie wydaje się zbytnio pomagać.

Odpowiedzi:


147

System.UriBuilder jest tym, czego szukasz ...

string ReplaceHost(string original, string newHostName) {
    var builder = new UriBuilder(original);
    builder.Host = newHostName;
    return builder.Uri.ToString();
}

Dzięki, właśnie tego szukałem.
Rasmus Faber

1
Poleciłbym klasę Uri, ale byłbym w błędzie. Dobra odpowiedź.
Jonathan C Dickinson

Działa świetnie, pamiętaj tylko, że jeśli czytasz właściwość Query, jest ona poprzedzona znakiem?, A jeśli ustawisz właściwość Query z ciągiem zaczynającym się od?, Innym? zostanie dołączony.
Dave,

Będziesz musiał obsługiwać porty, jeśli są określone w oryginalnym lub nowym.
Subiektywna rzeczywistość,

42

Jak mówi @Ishmael, możesz użyć System.UriBuilder. Oto przykład:

// 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
Podejrzewam, że lepiej byłoby uzyskać Uriinstancję przez wywołanie, newUriBuilder.Uria nie formatowanie i analizowanie.
Sam

@Sam masz rację, Urinieruchomość jest znacznie lepszą opcją. Dzięki. Zaktualizowano.
Drew Noakes

Uważaj na .Urirozmowę. Jeśli masz w sobie coś, UriBuilderco nie jest tłumaczone na prawidłowy Uri, to zostanie rzucone. Na przykład, jeśli potrzebujesz hosta wieloznacznego, *możesz go ustawić .Host, ale jeśli zadzwonisz .Uri, wyrzuci. Jeśli zadzwonisz UriBuilder.ToString(), zwróci Uri z umieszczonym symbolem wieloznacznym.
CubanX
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.