Изменение порта System.Uri

#c# #.net #uri

#c# #.net #uri

Вопрос:

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

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

Ответ №1:

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

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

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

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

Комментарии:

1. Следует отметить одну вещь о UriBuilder том, что если вы установите Port значение -1 , то будет использоваться значение по умолчанию для протокола, что полезно, если вам не нужен вывод номера порта.

2. @PaulTyng спасибо за этот скрытый камень! Это именно то, что я искал. (вместе с классом UriBuilder)

3. Однако, что такое Scheme? Что это делает, и что я должен туда поместить?

4. @cullub en.wikipedia.org/wiki/URI_scheme — часто это будет http, https или ftp

Ответ №2:

Я поддерживаю голос за 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
  

Комментарии:

1. Спасибо, UriBuilder отличный, и мне нравится метод расширения, так что 1. Собираюсь отметить ответ jglouie, хотя, поскольку он был первым

2. На мой взгляд, использовать расширение здесь нехорошо. Предоставление метода setPort, в котором вы должны получить возвращаемый Uri, не ожидается для пользователя. Для меня имеет смысл использовать его только так: uri.setPort(1337);