System.Uri
tiene Host
, Authority
y DnsSafeHost
. MS proporciona un buen ejemplo de cuándo Host
y DnsSafeHost
son diferentes aquí .
Me gustaría un ejemplo / explicación similar para Host
y Authority
.
Respuestas:
Sí, Brandon tiene toda la razón, en términos sencillos.
Autoridad = Nombre de host + No de puerto
Y si el protocolo URL está usando un puerto predeterminado, digamos puerto 80 para la URL http, entonces solo en ese caso Autoridad = Nombre de host (se supone que el número de puerto es 80),
Considerando que el nombre de host es nombre de dominio o dirección IP
Ejemplo:
http://www.example.com/
Autoridad = www.example.com
Nombre de host = www.example.com
http://255.255.255.255:8080/
Autoridad = 255.255.255.255:8080
Nombre de host = 255.255.255.255
User Information
pieza.
Desde la página MSDN URI.Host .
A diferencia de la propiedad Authority, este valor de propiedad no incluye el número de puerto.
Cada URL HTTP se ajusta a la sintaxis de un URI genérico. La sintaxis genérica de URI consta de una secuencia jerárquica de cinco componentes:
URI = scheme:[//authority]path[?query][#fragment]
donde el componente de autoridad se divide en tres subcomponentes:
authority = [userinfo@]host[:port]
Me gusta esto:
Un componente de autoridad opcional precedido por dos barras (//), que comprende:
Para obtener más detalles, puede consultar https://en.wikipedia.org/wiki/URL .
Para la clase Uri en .NET, Authority incluye el puerto, Host no lo hace y tampoco incluye información del usuario.
Algunos ejemplos de URI válidos:
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));
Según RFC3986 , la Sección 3.2 de la Autoridad contiene
NO solo el host y el número de puerto.
Por ejemplo, el siguiente es un URI válido:
http://user:password@host:80/path
en el que la Autoridad es
user:password@host:80
El símbolo arroba (@) delimita la información del usuario del host y los dos puntos (:) delimitan el host del número de puerto. Dentro de la información del usuario, dos puntos (:) delimitan el nombre de usuario de la contraseña. (Sí, sé que la parte de la contraseña está obsoleta. Es posible que todavía se admita opcionalmente)
Esta es la especificación completa para una autoridad. Obviamente, la información del usuario y el número de puerto a menudo no están presentes.
La clase Uri en .NET elimina la información del usuario cuando devuelve la Autoridad, lo cual es bastante molesto porque no es correcto. En su lugar, puede encontrar la información del usuario en la propiedad UserInfo:
Uri.UserInfo
Otras respuestas son técnicamente correctas para decir que para la clase .NET Uri, la diferencia entre Uri.Authority y Uri.Host es que el host no contendrá un número de puerto.
Pero tenga en cuenta que la autoridad no está definida correctamente de la forma en que se usa en la clase .NET Uri porque también puede contener información del usuario.
De acuerdo con la documentación a la que se vinculó, la Authority
propiedad incluirá el número de puerto si no es el mismo que el puerto predeterminado de la Uri, mientras que la Host
propiedad solo devolverá el nombre del host DNS o la dirección IP.
No creo que haya más diferencias que esa.
La autoridad también puede incluir un nombre de usuario y contraseña, p. Ej.
bob: pwd@somewhere.example.com
más comúnmente utilizado para URI de FTP