Замінити хост на Uri


86

Який найкращий спосіб замінити хост-частину Uri за допомогою .NET?

Тобто:

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 не надто допомагає.

Відповіді:


148

System.UriBuilder - це те, чим ви бажаєте ...

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

Дякую, це саме те, що я шукав.
Расмус Фабер

1
Я б порекомендував клас Uri, але я б помилився. Гарна відповідь.
Джонатан Сік Дікінсон

Чудово працює, просто зауважте, що якщо ви читаєте властивість Query, до неї додається знак?, А якщо ви встановили властивість Query з рядком, що починається з?, Іншим? буде додано.
Дейв

Вам доведеться обробляти порти, якщо вони вказані або в оригіналі, або в новому.
Суб’єктивна реальність

42

Як каже @Ishmael, ви можете використовувати System.UriBuilder. Ось приклад:

// 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
Я підозрюю, що може бути краще отримати Uriекземпляр за допомогою виклику, newUriBuilder.Uriа не форматування та аналізу.
Сем

@Sam ти маєш рацію, Uriвласність - набагато кращий варіант. Дякую. Оновлено.
Дрю Ноукс

Обережно .Uriдзвоніть. Якщо у вас є щось, UriBuilderщо не перекладається на дійсний Uri, це кине. Так, наприклад, якщо вам потрібен підстановочний хост, *ви можете встановити .Hostце, але якщо ви зателефонуєте, .Uriце кине. Якщо ви зателефонуєте, UriBuilder.ToString()він поверне Uri з узагальнюючим символом на місці.
CubanX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.