System.Uri
ma Host
, Authority
i DnsSafeHost
. MS stanowi dobry przykład tego, kiedy Host
i DnsSafeHost
są tutaj różne .
Chciałbym mieć podobny przykład / wyjaśnienie dla Host
i Authority
.
Odpowiedzi:
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:
http://www.example.com/
Authority = www.example.com
Host Name = www.example.com
http://255.255.255.255:8080/
Urząd = 255.255.255.255:8080
Nazwa hosta = 255.255.255.255
User Information
części.
Ze strony MSDN URI.Host .
W przeciwieństwie do właściwości Authority ta wartość właściwości nie obejmuje numeru portu.
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:
Opcjonalny komponent autorytetu poprzedzony dwoma ukośnikami (//), zawierający:
Więcej informacji można znaleźć pod adresem https://en.wikipedia.org/wiki/URL .
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
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.
Zgodnie z dokumentacją, z którą utworzyłeś łącze, Authority
właściwość będzie zawierać numer portu, jeśli nie jest taki sam jak domyślny port Uri, a Host
właściwość zwróci tylko nazwę hosta DNS lub adres IP.
Nie sądzę, żeby było więcej różnic niż to.
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