System.Uri
є Host
, Authority
і DnsSafeHost
. MS забезпечує хороший приклад , коли Host
і DnsSafeHost
різні тут .
Я хотів би отримати подібний приклад / пояснення для Host
і Authority
.
Відповіді:
Так, Брендон абсолютно правильний, якщо говорити непрофесійно
Повноваження = Ім'я хоста + Номер порту
І якщо протокол URL-адреси використовує порт за замовчуванням, скажімо порт 80 для URL-адреси http, то лише в такому випадку Authority = Host Name (номер порту вважається 80),
Тоді як ім'я хоста - це або доменне ім'я, або IP-адреса
Приклад:
http://www.example.com/
Повноваження = www.example.com
Ім'я хоста = www.example.com
http://255.255.255.255:8080/
Повноваження = 255.255.255.255:8080
Ім'я хоста = 255.255.255.255
User Information
частину.
Кожна URL-адреса HTTP відповідає синтаксису загального URI. Загальний синтаксис URI складається з ієрархічної послідовності з п’яти компонентів:
URI = scheme:[//authority]path[?query][#fragment]
де компонент повноважень ділиться на три підкомпоненти:
authority = [userinfo@]host[:port]
Подобається це:
Необов’язковий компонент уповноваження, якому передують дві похилі риски (//), що включає:
Для отримання детальної інформації ви можете звернутися до https://en.wikipedia.org/wiki/URL .
Для класу 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 містить орган
НЕ просто номер хосту та порту.
Наприклад, такий дійсний 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, оскільки він також може містити інформацію про користувача.
Відповідно до документації, до якої ви зв’язали, Authority
властивість включатиме номер порту, якщо він не збігається з портом Uri за замовчуванням, тоді як Host
властивість повертатиме лише ім’я хосту DNS або IP-адресу.
Я не вірю, що є більше відмінностей, ніж це.
Орган також може включати ім’я користувача та пароль, наприклад
bob: pwd@somewhere.example.com
частіше використовується для FTP URI