Яка різниця між Uri.Host та Uri.Authority


86

System.Uriє Host, Authorityі DnsSafeHost. MS забезпечує хороший приклад , коли Hostі DnsSafeHostрізні тут .

Я хотів би отримати подібний приклад / пояснення для Hostі Authority.

Відповіді:


105

Так, Брендон абсолютно правильний, якщо говорити непрофесійно

Повноваження = Ім'я хоста + Номер порту

І якщо протокол URL-адреси використовує порт за замовчуванням, скажімо порт 80 для URL-адреси http, то лише в такому випадку Authority = Host Name (номер порту вважається 80),

Тоді як ім'я хоста - це або доменне ім'я, або IP-адреса

Приклад:

  1. http://www.example.com/

    Повноваження = www.example.com
    Ім'я хоста = www.example.com

  2. http://255.255.255.255:8080/

    Повноваження = 255.255.255.255:8080
    Ім'я хоста = 255.255.255.255


1
Один невеликий сумнів. якщо я запускаю додаток у localhost, у моїй URL-адресі є номер порту, але у виробництві я не маю номера порту в URL-адресі. Отже, я можу вільно використовувати Url.Authority, так? Я маю на увазі, якщо номера порту немає, тоді URl.Authority діятиме так само, як URL.Host right. Я маю на увазі, що я все одно зможу правильно отримати URL-адресу, правильно? будь ласка, направляй мене ,.
Незламний

Прочитайте stackoverflow.com/a/39415643/316343 , він пропустив User Informationчастину.
Джахан,

Чи є посилання на документацію для цієї відповіді? Щось авторитетне?
Джонатан М

35

З URI MSDN. Хост- сторінка.

На відміну від властивості Authority, це значення властивості не включає номер порту.


Один невеликий сумнів. якщо я запускаю додаток у localhost, у моїй URL-адресі є номер порту, але у виробництві я не маю номера порту в URL-адресі. Отже, я можу вільно використовувати Url.Authority, так? Я маю на увазі, якщо номера порту немає, тоді URl.Authority діятиме так само, як URL.Host right. Я маю на увазі, що я все одно зможу правильно отримати URL-адресу, правильно? будь ласка, направляй мене.
Незламний

@ Unbreakable - Правильно, це спрацює в обох випадках. Якщо ви не вказали номер порту в URL-адресі, ви просто використовуєте номер за замовчуванням, і в цьому випадку Url.Authority опускає порт.
BornToCode

17

Кожна URL-адреса HTTP відповідає синтаксису загального URI. Загальний синтаксис URI складається з ієрархічної послідовності з п’яти компонентів:

URI = scheme:[//authority]path[?query][#fragment]

де компонент повноважень ділиться на три підкомпоненти:

authority = [userinfo@]host[:port]

Подобається це:

вікі

Необов’язковий компонент уповноваження, якому передують дві похилі риски (//), що включає:

  • Необов’язковий підкомпонент userinfo, який може складатися з імені користувача та необов’язкового пароля, перед яким ставиться двокрапка (:), а потім символ at (@). Використання формату username: пароль у підкомпоненті userinfo застарілий із міркувань безпеки. Програми не повинні відображати як чистий текст будь-які дані після першої двокрапки (:), знайдені в підкомпоненті userinfo, якщо дані після двокрапки не є порожнім рядком (що не вказує на пароль).
  • Необов’язковий підкомпонент хосту , що складається або із зареєстрованого імені (включаючи, але не обмежуючись ім’ям хосту), або IP-адреси. Адреси IPv4 повинні мати десяткові крапки, а адреси IPv6 - у дужках ([]).
  • Необов’язковий підкомпонент порту, перед яким ставиться двокрапка (:).

Для отримання детальної інформації ви можете звернутися до https://en.wikipedia.org/wiki/URL .


12

Для класу Uri в .NET авторизація включає порт, хост - ні, а також інформацію про користувача.

Кілька прикладів дійсних URI:

Uri u = new Uri("http://www.domain.com/path");
Assert.AreEqual("www.domain.com", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com", u.GetLeftPart(UriPartial.Authority));

u = new Uri("http://www.domain.com:8080/path");
Assert.AreEqual("www.domain.com:8080", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com:8080", u.GetLeftPart(UriPartial.Authority));

u = new Uri("http://user:password@host:555/path");
Assert.AreEqual("host:555", u.Authority);
Assert.AreEqual("host", u.Host);
Assert.AreEqual("http://user:password@host:555", u.GetLeftPart(UriPartial.Authority));

Відповідно до RFC3986 , розділ 3.2 містить орган

  1. Інформація про користувача
  2. Ведучий
  3. Номер порту.

НЕ просто номер хосту та порту.

Наприклад, такий дійсний URI:

http://user:password@host:80/path

в якому знаходиться Адміністрація

user:password@host:80

Символ at (@) обмежує інформацію про користувача від хоста, а двокрапка (:) - хост від номера порту. В межах інформації про користувача двокрапка (:) обмежує ім’я користувача від пароля. (Так, я знаю, що частина пароля застаріла. Вона може додатково підтримуватися.)

Це повна специфікація для Органу. Очевидно, що інформація про користувача та номер порту часто відсутні.

Клас Uri у .NET скидає інформацію про користувача при поверненні авторитету, що досить дратує, оскільки це неправильно. Натомість ви можете знайти інформацію про користувача у властивості UserInfo:

Uri.UserInfo

Інші відповіді технічно правильні, якщо стверджувати, що для класу .NET Uri різниця між Uri.Authority та Uri.Host полягає в тому, що хост не буде містити номер порту.

Але майте на увазі, що Authority не визначено належним чином, як він використовується в класі .NET Uri, оскільки він також може містити інформацію про користувача.


10

Відповідно до документації, до якої ви зв’язали, Authorityвластивість включатиме номер порту, якщо він не збігається з портом Uri за замовчуванням, тоді як Hostвластивість повертатиме лише ім’я хосту DNS або IP-адресу.

Я не вірю, що є більше відмінностей, ніж це.


1
Один невеликий сумнів. якщо я запускаю додаток у localhost, у моїй URL-адресі є номер порту, але у виробництві я не маю номера порту в URL-адресі. Отже, я можу вільно використовувати Url.Authority, так? Я маю на увазі, якщо номера порту немає, тоді URl.Authority діятиме так само, як URL.Host right. Я маю на увазі, що я все одно зможу правильно отримати URL-адресу, правильно? будь ласка, направляй мене.
Незламний

0

Орган також може включати ім’я користувача та пароль, наприклад

bob: pwd@somewhere.example.com

частіше використовується для FTP URI


вибачте, ви помиляєтесь. З RFC 3986, розділ 3.2 Повноваження "Authority = [userinfo" @ "] host [": "port]"
Адріен

Інформація про користувача зі звичайними паролями застаріла в RFC, але все ще використовується загалом, особливо з FTP URI, і IE все ще підтримує це (насправді це єдиний спосіб авторизації за допомогою FTP через IE через http-проксі).
Адріен

4
Питання про System.URI.Authority, який НЕ є таким, як RFC 3986.
Брайан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.