96 votes

Quelle est la différence entre Uri.Host et Uri.Authority ?

System.Uri a Host , Authority et DnsSafeHost . MS fournit un bon exemple de quand Host y DnsSafeHost sont différents ici .

J'aimerais avoir un exemple/explication similaire pour Host y Authority .

121voto

Saurabh Mishra Points 96

Oui, Brandon a tout à fait raison, en termes simples.

Autorité = Nom d'hôte + n° de port

Et si le protocole URL utilise un port par défaut, disons le port 80 pour l'URL http, alors seulement dans ce cas Autorité = Nom de l'hôte (le numéro de port est supposé être 80),

Alors que le nom d'hôte est soit un nom de domaine, soit une adresse IP.

Exemple :

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

    Autorité = www.example.com
    Nom d'hôte = www.example.com

  2. http://255.255.255.255:8080/

    Autorité = 255.255.255.255:8080
    Nom d'hôte = 255.255.255.255

1 votes

Un petit doute. Si j'exécute l'application en localhost j'ai le numéro de port dans mon URL mais en production je n'ai pas de numéro de port dans l'URL. Je peux donc utiliser librement Url.Authority, n'est-ce pas ? Je veux dire que si le numéro de port n'est pas présent, URl.Authority agira de la même manière que URL.Host. Je veux dire que je serai toujours en mesure d'obtenir l'URL correctement, n'est-ce pas ? Veuillez me guider.

0 votes

Lire stackoverflow.com/a/39415643/316343 il a manqué le User Information partie.

0 votes

Existe-t-il une documentation de référence pour cette réponse ? Quelque chose qui fait autorité ?

37voto

kervin Points 7620

De MSDN URI.Host page.

Contrairement à la propriété Authority, la valeur de cette propriété ne comprend pas le numéro de port.

0 votes

Un petit doute. Si j'exécute l'application en localhost j'ai le numéro de port dans mon URL mais en production je n'ai pas de numéro de port dans l'URL. Donc, je peux utiliser librement Url.Authority, n'est-ce pas ? Je veux dire que si le numéro de port n'est pas présent, URl.Authority agira de la même manière que URL.Host. Je veux dire que je serai toujours en mesure d'obtenir l'URL correctement, n'est-ce pas ? Veuillez me guider.

0 votes

@Unbreakable - C'est exact, cela fonctionnera dans les deux cas. Lorsque vous ne spécifiez pas le numéro de port dans l'url, vous utilisez celui par défaut et dans ce cas Url.Authority omet le port.

22voto

Frank.Chang Points 66

Chaque URL HTTP est conforme à la syntaxe d'un URI générique. La syntaxe de l'URI générique consiste en une séquence hiérarchique de cinq composants :

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

où le autorité se divise en trois sous-composantes :

authority = [userinfo@]host[:port]

Comme ça :

wiki

Une option autorité composante précédée de deux barres obliques (//), comprenant :

  • Une option info utilisateur qui peut se composer d'un nom d'utilisateur et d'un mot de passe facultatif précédé de deux points ( :), suivi d'un symbole at (@). L'utilisation du format nom d'utilisateur:mot de passe dans le sous-composant userinfo est dépréciée pour des raisons de sécurité. Les applications ne doivent pas rendre en clair les données situées après les deux-points ( :) dans un sous-composant userinfo, sauf si les données situées après les deux-points sont une chaîne vide (indiquant l'absence de mot de passe).
  • Une option hôte qui consiste en un nom enregistré (y compris, mais sans s'y limiter, un nom d'hôte) ou une adresse IP. Les adresses IPv4 doivent être en notation point-décimal, et les adresses IPv6 doivent être entre parenthèses ([]).
  • Une option port sous-composant précédé de deux points ( :).

Pour plus de détails, vous pouvez vous référer à https://en.wikipedia.org/wiki/URL .

15voto

Pour la classe Uri dans .NET, Authority inclut le port, Host ne l'inclut pas et aucun des deux n'inclut les informations sur l'utilisateur.

Quelques exemples d'URIs valides :

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));

Selon RFC3986 , Section 3.2 l'Autorité contient

  1. Informations sur l'utilisateur
  2. Hôte
  3. Numéro de port.

PAS seulement l'hôte et le numéro de port.

Par exemple, le texte suivant est une URI valide :

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

dans laquelle l'Autorité est

user:password@host:80

Le symbole at (@) sépare les informations sur l'utilisateur de l'hôte et les deux points ( :) séparent l'hôte du numéro de port. Dans les informations sur l'utilisateur, les deux points ( :) séparent le nom d'utilisateur du mot de passe. (Oui, je sais que la partie mot de passe est dépréciée. Elle peut encore être supportée de manière optionnelle).

Il s'agit du cahier des charges complet d'une autorité. Évidemment, les informations sur l'utilisateur et le numéro de port sont souvent absents.

El La classe Uri de .NET supprime les informations relatives à l'utilisateur. lors du retour de l'autorité, ce qui est plutôt ennuyeux car ce n'est pas correct. Au lieu de cela, vous pouvez trouver les informations sur l'utilisateur dans la propriété UserInfo :

Uri.UserInfo

D'autres réponses sont techniquement correctes pour dire que pour la classe .NET Uri que la différence entre Uri.Authority et Uri.Host est que l'hôte ne contiendra pas de numéro de port.

Mais sachez que L'autorité n'est pas correctement définie de la manière dont elle est utilisée dans la classe Uri de .NET. car il peut aussi contenir des informations sur l'utilisateur.

11voto

Brandon Points 35624

Selon la documentation à laquelle vous avez fait référence, le Authority inclura le numéro de port s'il n'est pas identique au port par défaut de l'Uri, tandis que la propriété Host ne renverra que le nom d'hôte DNS ou l'adresse IP.

Je ne crois pas qu'il y ait plus de différences que cela.

1 votes

Un petit doute. Si j'exécute l'application en localhost j'ai le numéro de port dans mon URL mais en production je n'ai pas de numéro de port dans l'URL. Je peux donc utiliser librement Url.Authority, n'est-ce pas ? Je veux dire que si le numéro de port n'est pas présent, URl.Authority agira de la même manière que URL.Host. Je veux dire que je serai toujours en mesure d'obtenir l'URL correctement, n'est-ce pas ? Veuillez me guider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X