Jaka jest różnica między Uri.Host a Uri.Authority


86

System.Urima Host, Authorityi DnsSafeHost. MS stanowi dobry przykład tego, kiedy Hosti DnsSafeHostsą tutaj różne .

Chciałbym mieć podobny przykład / wyjaśnienie dla Hosti Authority.

Odpowiedzi:


105

Tak, Brandon ma całkowitą rację, w kategoriach laika

Urząd = nazwa hosta + numer portu

A jeśli protokół URL używa domyślnego portu, powiedzmy port 80 dla adresu URL http, to tylko w tym przypadku Urząd = Nazwa hosta (przyjmuje się, że numer portu to 80),

Natomiast nazwa hosta to nazwa domeny lub adres IP

Przykład:

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

    Authority = www.example.com
    Host Name = www.example.com

  2. http://255.255.255.255:8080/

    Urząd = 255.255.255.255:8080
    Nazwa hosta = 255.255.255.255


1
Jedna mała wątpliwość. jeśli uruchamiam aplikację w localhost mam numer portu w adresie URL, ale w produkcji nie mam numeru portu w adresie URL. Więc mogę swobodnie korzystać z Url.Authority, prawda? Mam na myśli, że jeśli nie ma numeru portu, URl.Authority będzie działać tak samo jak URL.Host right. Chodzi mi o to, że nadal będę w stanie poprawnie uzyskać adres URL, prawda? proszę, prowadź mnie,.
— Unbreakable

Przeczytaj stackoverflow.com/a/39415643/316343 , brakowało User Informationczęści.
— Jahan

Czy istnieje odniesienie do dokumentacji dla tej odpowiedzi? Coś autorytatywnego?
— Jonathan M

35

Ze strony MSDN URI.Host .

W przeciwieństwie do właściwości Authority ta wartość właściwości nie obejmuje numeru portu.


Jedna mała wątpliwość. jeśli uruchamiam aplikację w localhost mam numer portu w adresie URL, ale w produkcji nie mam numeru portu w adresie URL. Więc mogę swobodnie korzystać z Url.Authority, prawda? Mam na myśli, że jeśli nie ma numeru portu, URl.Authority będzie działać tak samo jak URL.Host right. Chodzi mi o to, że nadal będę w stanie poprawnie uzyskać adres URL, prawda? proszę, prowadź mnie.
— Unbreakable

@Unbreakable - Zgadza się, będzie działać w obu przypadkach. Jeśli nie określisz numeru portu w adresie URL, użyjesz tylko domyślnego iw takim przypadku Url.Authority pomija ten port.
— BornToCode

17

Każdy adres URL HTTP jest zgodny ze składnią ogólnego identyfikatora URI. Ogólna składnia identyfikatora URI składa się z hierarchicznej sekwencji pięciu składników:

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

gdzie komponent autorytetu dzieli się na trzy podkomponenty:

authority = [userinfo@]host[:port]

Lubię to:

wiki

Opcjonalny komponent autorytetu poprzedzony dwoma ukośnikami (//), zawierający:

  • Opcjonalne informacje o użytkowniku który może składać się z nazwy użytkownika i opcjonalnego hasła poprzedzonego dwukropkiem (:), po którym następuje symbol at (@). Użycie formatu nazwa_użytkownika: hasło w podkomponentu informacji o użytkowniku jest przestarzałe ze względów bezpieczeństwa. Aplikacje nie powinny wyświetlać jako zwykłego tekstu żadnych danych po pierwszym dwukropku (:) znalezionych w podskładniku informacji o użytkowniku, chyba że dane po dwukropku są pustym łańcuchem (wskazującym brak hasła).
  • Opcjonalny składnik podrzędny hosta , składający się z zarejestrowanej nazwy (w tym między innymi nazwy hosta) lub adresu IP. Adresy IPv4 muszą być podane w notacji dziesiętnej z kropkami, a adresy IPv6 należy ująć w nawiasy kwadratowe ([]).
  • Opcjonalny składnik podrzędny portu poprzedzony dwukropkiem (:).

Więcej informacji można znaleźć pod adresem https://en.wikipedia.org/wiki/URL .


12

W przypadku klasy Uri w platformie .NET Urząd obejmuje port, a Host nie zawiera informacji o użytkowniku.

Kilka przykładów prawidłowych identyfikatorów 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));

Zgodnie z RFC3986 , sekcja 3.2 Urząd zawiera

  1. Informacje o użytkowniku
  2. Gospodarz
  3. Numer portu.

NIE tylko numer hosta i portu.

Na przykład poniżej przedstawiono prawidłowy identyfikator URI:

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

w którym znajduje się Urząd

user:password@host:80

Symbol at (@) oddziela informacje o użytkowniku z hosta, a dwukropek (:) oddziela hosta od numeru portu. W informacjach o użytkowniku, dwukropek (:) oddziela nazwę użytkownika od hasła. (Tak, wiem, że część hasła jest przestarzała. Opcjonalnie może być nadal obsługiwana).

To jest pełna specyfikacja organu. Oczywiście informacje o użytkowniku i numer portu często nie są obecne.

Klasa Uri .NET spada informacji użytkownika po powrocie organu, który jest dość irytujące, ponieważ nie jest prawidłowe. Zamiast tego możesz znaleźć informacje o użytkowniku we właściwości UserInfo:

Uri.UserInfo

Inne odpowiedzi są technicznie poprawne, jeśli chodzi o klasę .NET Uri różnica między Uri.Authority i Uri.Host polega na tym, że host nie będzie zawierał numeru portu.

Należy jednak pamiętać, że uprawnienia nie są odpowiednio zdefiniowane w sposób, w jaki są używane w klasie .NET Uri, ponieważ mogą również zawierać informacje o użytkowniku.


10

Zgodnie z dokumentacją, z którą utworzyłeś łącze, Authoritywłaściwość będzie zawierać numer portu, jeśli nie jest taki sam jak domyślny port Uri, a Hostwłaściwość zwróci tylko nazwę hosta DNS lub adres IP.

Nie sądzę, żeby było więcej różnic niż to.


1
Jedna mała wątpliwość. jeśli uruchamiam aplikację w localhost mam numer portu w adresie URL, ale w produkcji nie mam numeru portu w adresie URL. Więc mogę swobodnie korzystać z Url.Authority, prawda? Mam na myśli, że jeśli nie ma numeru portu, URl.Authority będzie działać tak samo jak URL.Host right. Chodzi mi o to, że nadal będę w stanie poprawnie uzyskać adres URL, prawda? proszę, prowadź mnie.
— Unbreakable

0

Uprawnienie może również zawierać nazwę użytkownika i hasło, np

bob: pwd@somewhere.example.com

częściej używany dla identyfikatorów URI FTP


przepraszam, mylisz się. Z dokumentu RFC 3986, sekcja 3.2 Authority "Authority = [informacje o użytkowniku" @ "] host [": "port]"
— Adrien

informacje o użytkowniku ze zwykłymi hasłami są przestarzałe w RFC, ale nadal są w powszechnym użyciu, szczególnie w przypadku identyfikatorów URI FTP, a IE nadal to obsługuje (w rzeczywistości jest to jedyny sposób na autoryzację z FTP przez IE przez proxy http).
— Adrien

4
Pytanie dotyczy Autoryzacji System.URI., która NIE jest tym samym, co RFC 3986.
— Brian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.