В чем разница между 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/

    Authority = www.example.com
    Имя хоста = www.example.com

  2. http://255.255.255.255:8080/

    Authority = 255.255.255.255:8080
    Имя хоста = 255.255.255.255


1
Одно небольшое сомнение. если я запускаю приложение на локальном хосте, у меня есть номер порта в моем URL-адресе, но при производстве у меня нет номера порта в URL-адресе. Итак, я могу свободно использовать Url.Authority, верно? Я имею в виду, что если номер порта отсутствует, URl.Authority будет действовать так же, как URL.Host right. Я имею в виду, что я все равно смогу правильно получить URL? пожалуйста, направьте меня.
Unbreakable

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

Есть ли ссылка на документацию для этого ответа? Что-то авторитетное?
Джонатан М.

35

Со страницы MSDN URI.Host .

В отличие от свойства Authority, значение этого свойства не включает номер порта.


Одно небольшое сомнение. если я запускаю приложение на локальном хосте, у меня есть номер порта в моем URL-адресе, но при производстве у меня нет номера порта в URL-адресе. Итак, я могу свободно использовать Url.Authority, верно? Я имею в виду, что если номер порта отсутствует, URl.Authority будет действовать так же, как URL.Host right. Я имею в виду, что я все равно смогу правильно получить URL? пожалуйста, направь меня.
Unbreakable

@Unbreakable - Верно, это сработает в обоих случаях. Если вы не указываете номер порта в URL-адресе, вы просто используете порт по умолчанию, и в этом случае Url.Authority пропускает порт.
BornToCode

17

Каждый URL-адрес HTTP соответствует синтаксису универсального URI. Общий синтаксис URI состоит из иерархической последовательности из пяти компонентов:

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

где компонент полномочий делится на три подкомпонента:

authority = [userinfo@]host[:port]

Как это:

вики

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

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

Для получения дополнительной информации вы можете обратиться к https://en.wikipedia.org/wiki/URL .


12

Для класса Uri в .NET Authority включает порт, Host - нет, и ни одна из них не включает информацию о пользователе.

Некоторые примеры действительных 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 сбрасывает информацию о пользователе при возврате Authority, что довольно раздражает, потому что это неверно. Вместо этого вы можете найти информацию о пользователе в свойстве UserInfo:

Uri.UserInfo

Другие ответы технически правильны, чтобы сказать, что для класса .NET Uri разница между Uri.Authority и Uri.Host заключается в том, что хост не будет содержать номер порта.

Но имейте в виду, что Authority не определен должным образом, как он используется в классе .NET Uri, поскольку он также может содержать информацию о пользователе.


10

Согласно документации, на которую вы ссылаетесь, Authorityсвойство будет включать номер порта, если он не совпадает с портом Uri по умолчанию, в то время как Hostсвойство будет возвращать только имя хоста DNS или IP-адрес.

Я не верю, что существует больше различий, чем это.


1
Одно небольшое сомнение. если я запускаю приложение на локальном хосте, у меня есть номер порта в моем URL-адресе, но при производстве у меня нет номера порта в URL-адресе. Итак, я могу свободно использовать Url.Authority, верно? Я имею в виду, что если номер порта отсутствует, URl.Authority будет действовать так же, как URL.Host right. Я имею в виду, что я все равно смогу правильно получить URL? пожалуйста, направь меня.
Unbreakable

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.