Изменение порта System.Uri - PullRequest
22 голосов
/ 26 мая 2011

Итак, у меня есть Uri объект, который содержит адрес, что-то вроде http://localhost:1000/blah/blah/blah. Мне нужно изменить номер порта и оставить все остальные части адреса нетронутыми. Допустим, мне нужно, чтобы оно было http://localhost:1080/blah/blah/blah.

Объекты Uri практически неизменны, поэтому я могу получить доступ к номеру порта через свойство Port, но оно доступно только для чтения. Есть ли какой-нибудь вменяемый способ создать объект Uri точно так же, как другой, но с другим портом? Под «вменяемым» я подразумеваю «не возиться с регулярными выражениями и манипуляциями со строками», потому что, хотя для приведенного выше примера это тривиально, для меня он все еще пахнет червячной банкой. Если это единственный способ, я действительно надеюсь, что он уже кем-то реализован, и, возможно, есть некоторые помощники (хотя я не нашел ни одного)

Заранее спасибо.

Ответы [ 2 ]

46 голосов
/ 26 мая 2011

Рассматривали ли вы класс UriBuilder?

http://msdn.microsoft.com/en-us/library/system.uribuilder.aspx

Класс UriBuilder предоставляет удобный способ изменения содержимого экземпляра Uri без создания нового экземпляра Uri для каждой модификации.

Свойства UriBuilder предоставляют доступ на чтение / запись к свойствам Uri только для чтения, так что их можно изменять.

41 голосов
/ 26 мая 2011

Я второй голос за UriBuilder . У меня действительно есть метод расширения для изменения порта URI:

public static class UriExtensions {
    public static Uri SetPort(this Uri uri, int newPort) {
        var builder = new UriBuilder(uri);
        builder.Port = newPort;
        return builder.Uri;
    }
}

Использование:

var uri = new Uri("http://localhost:1000/blah/blah/blah");
uri = uri.SetPort(1337); // http://localhost:1337/blah/blah/blah
...