sticky
FAQ - System.Uri RRS feed

Все ответы

  • Q. Если URI это просто строка символов почему нужно использовать System.Uri всегда?

    A. URI является строкой символов, но не обязательно простой. Например, рассмотрим следующий URI:

    HTTPS://basicUser:password@www.xn--fek.COM:443/path/../realpath/./ル/my-App.Aspx?QueryParam1=value1;param2=value2#document_Fragment

    Есть целый ряд открытых стандартов, которые определяют синтаксис URI. Роль System.Uri – проверка синтаксиса строки, а также обеспечение легкого доступа к компонентам URI. Microsoft относится к этому серьезно и добавила ряд правил к анализу кода в Visual Studio, чтобы препятствовать использованию string для хранения URI. Для дополнительной информации смотрите CA1054: параметры URI не должны быть строками


    Для связи [mail]

    30 марта 2011 г. 12:14
    Модератор
  • Q. Какие открытые стандарты поддерживает System.Uri? Изменилось ли что-нибудь в новых версиях .NET?

    A. Когда класс System.Uri был впервые представлен в .NET 1.0, он реализовывал открытые стандарты, описанные в RFCs 1736, 1738 и 2396, наряду с другой функциональностью, необходимой для базового типа .NET Framework. С тех пор эти стандарты были обновлены или заменены новыми стандартами, представленными в RFCs 3490, 3986, 3987 и другими. В .NET 3.5 System.Uri был расширен, чтобы добавить поддержку стандартов RFC 3490 и 3987. Для того чтобы сохранить обратную совместимость при переходе с RFC 2396 на 3986 были внесены лишь небольшие изменения.


    Для связи [mail]
    30 марта 2011 г. 12:15
    Модератор
  • Q. Какие свойства System.Uri использовать для получения компонент URI?

    A. Вот некоторые из основных свойств и также те данные, которые они предоставляют из примера выше.

    Свойство/метод      
    Результат
    OriginalString HTTPS://basicUser:password@www.xn--fek.COM:443/path/../realpath/./ル/my-App.Aspx?QueryParam1=value1;param2=value2#document_Fragment
    Scheme https
    UserInfo basicUser:password
    Host www.ル.com
    DnsSafeHost www.xn--fek.COM
    Port 443
    Authority* www.ル.com (+ ‘:’ + порт, для портов не по умолчанию)
    AbsolutePath /realpath/%E3%83%AB/my-App.Aspx
    Query ?QueryParam1=value1;param2=value2
    Fragment #document_Fragment
    AbsoluteUri https://basicUser:password@www.ル.com/realpath/%E3%83%AB/my-App.Aspx?QueryParam1=value1;param2=value2#document_Fragment
    ToString() https://basicUser:password@www.ル.com/realpath/ル/my-App.Aspx?QueryParam1=value1;p aram2=value2#document_Fragment

    * - В RFC указано, что Authority может дополнительно включать UserInfo. Для повышения безопасности и ограничения разоблачения учетных данных пользователя, класс System.Uri не включает UserInfo в Authority.


    Для связи [mail]



    30 марта 2011 г. 12:27
    Модератор
  • Q. Почему я не получаю именно то, что сохранил в URI?

    A. В соответствии с RFC некоторые компоненты URI могут быть заданы не совсем в стандартном формате, после чего они будут преобразованы в стандартный формат. Этот процесс называется канонизация или нормализация. Например, схема и хост должны быть заданы в нижнем регистре, порт по умолчанию должен быть отброшен. Кроме того System.URI расширяет IPv6 адреса до их длинной формы записи. Все эти действия необходимы для облегчения эквивалентности проверки при доступе к ресурсам и проверке безопасности доступа.


    Для связи [mail]
    30 марта 2011 г. 12:55
    Модератор
  • Q. Почему я не могу изменять любое из свойств System.Uri?

    A. Это нельзя сделать потому, что System.Uri является неизменяемым базовым типом, таким как System.String. Вы бы не могли доверять System.Uri, если бы кто-то мог изменить его содержимое. Чтобы легко удалять, изменять или собирать компоненты URI используйте класс System.UriBuilder или System.UriTemplate. Также используйте относительное Uri API; Uri.MakeRelativeUri и конструктор System.Uri.


    Для связи [mail]
    30 марта 2011 г. 12:59
    Модератор
  • Q. Какие схемы поддерживает System.Uri?

    A. System.Uri имеет встроенные правила анализа для HTTP, HTTPS, FILE, FTP, Gopher, MailTo, NetPipe, NetTcp, News, Nntp, Uuid, а также общие правила разбора, применяемые к неизвестным схемам. Вот несколько примеров каждой из этих схем:

    http://user:password@host:80/path/file.txt?Query#fragment
    https://user:password@host:443/path/file.txt?Query#fragment
    ftp://user:password@host:21/path/file.txt#fragment
    file://host/path/file.txt?Query#fragment
    c:\path\file.txt  (implicit DOS file)
    \\host\share\path\file.txt  (implicit UNC file)
    gopher://user:password@host:70/path/file.txt#fragment
    news:///path/file.txt#fragment
    nntp://user:password@host:119/path/file.txt#fragment
    telnet://user:password@host:23/path/file.txt#fragment
    ldap://user:password@host:389/path/file.txt?Query#fragment
    mailto:user:password@host:25/path/file.txt?Query#fragment
    net.pipe://host/path/file.txt?Query#fragment
    net.tcp://host:808/path/file.txt?Query#fragment
    uuid:///path/file.txt#fragment


    Для связи [mail]
    30 марта 2011 г. 13:01
    Модератор
  • Q. Я должен использовать конструкцию try/catch каждый раз, как создаю новый System.Uri?

    A. Нет, не всегда. В .NET 3.5 добавлены перегруженные методы System.Uri.TryCreate, с помощью которых мы можете пользовательские данные без использования конструкций try-catch.

    Uri result = null;
       if (!Uri.TryCreate(userUriString, UriKind.Absolute, out result))
       {
         // Fail gracefully, ask the user to try again.
         return false;
    }
    
    

    Обратной стороной является то, что когда невозможно разобрать URI, эти методы не возвращают сообщение об ошибке, объясняющее что не так во входных данных. Если нужно отобразить сообщение об ошибке, то вам придется использовать try-catch блок.


    Для связи [mail]
    30 марта 2011 г. 13:05
    Модератор
  • Q. Почему System.Uri MailTo схема не поддерживает несколько email адресов?

    A. System.Uri поддерживает RFC 1738, который разрешает только один email адрес в Authority компоненте MailTo URI.

    Альтернативным способом представления нескольких адресов электронной почты в одном System.URI является использование параметров запроса, как описано в RFC 2368. Следующий пример хорошо работает с Microsoft Outlook:

    mailto:jim@contoso.com?cc=test@contoso.com;billy@contoso.com&bcc=sally@contoso.com&subject=High%20there&to=boby@contoso.com

    Единственное ограничение в этом формате является то, что Outlook будет заполнять  поле To  только основным адресом электронной почты (jim@contoso.com). Любое другое To в запросе будет игнорироваться (boby@contoso.com). Другие почтовые клиенты могут иметь другое поведение.

    Кроме того, если вам нужно разобрать несколько email адресов из строки данных, то вы можете использовать класс System.Net.Mail.MailAddressCollection.

    Если вы имеете доступ к почтовому серверу, вы можете добавить все необходимы адреса в список рассылки. Тогда вам нужно будет использовать всего один адрес списка рассылки (MyGroup@constoso.com).


    Для связи [mail]
    30 марта 2011 г. 13:08
    Модератор
  • Q. Почему я не могу использовать # в путе file:///? Это же символ имени файла!

    A. В стандартной URI символ # определяет начало фрагмента. Т.к. это может приводить к конфликтам с локальными файловыми путями, System.Uri рассматривает по разному # для Dos и Unc путей.

      Явные Неявные
    Dos  
    file:///c:/path/file.txt#Fragment c:\path\file#name.txt
    Unc file://server/share/path/file.txt#Fragment  
    \\server\share\path\file#name.txt

    Как показано в таблице в графе явные URI файлу разрешено иметь фрагменты, так что символ # не рассматривается как часть пути к файлу (LocalPath или AbsolutePath). Неявные URI не может иметь фрагменты, поэтому # является частью пути.


    Для связи [mail]
    30 марта 2011 г. 13:15
    Модератор
  • Q. Почему System.URI переводит мою Unicode ссылку в вид xn--fek или %E3%83%AB?

    A. Многие компьютерные программы и протоколы до сих пор понимают только Latin/ASCII наборы символов, поэтому в System.Uri реализована логика для кодирования и декодирования нелатинских символов Unicode. Эта поддержка была значительно расширена в .NET 3.5 для включения IDN и IRI RFC стандартов, описанных ниже. По причинам обратной совместимости это новое поведение может быть включено только в файле конфигурации. Для подробностей смотрите документацию System.Uri.

    RFC 3490 описывает международные доменные имена (IDN). Этот стандарт охватывает кодировку нелатинских юникод символов в хост части URI. Эта кодировка предназначена для обратной совместимости с существующими DNS стандартами и реализациями. Свойство Uri.DnsSafeHost было расширено, чтобы показать этот новый формат.

    RFC 3987 вводит интернационализированные идентификаторы ресурсов (IRIs). Этот стандарт определяет как кодировать нелатинские символы Unicode вне хост части URI. Используйте свойство Uri.AbsoluteUri вместо Uri.ToString() для получения этой кодировки.


    Для связи [mail]
    30 марта 2011 г. 13:18
    Модератор