#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);