web-dev-qa-db-fra.com

ASP.NET Core 2.1 obtient le nom d'hôte Web actuel et le port dans Startup.cs

Je souhaite enregistrer mon WebAPI sur la découverte du service Consul et pour cela, je dois fournir l'URL de mon WebAPI (par exemple: http://service1.com ) et le point de terminaison du contrôle d'intégrité ( http: //service1.com/health/check ). Comment puis-je obtenir cette URL?

J'ai trouvé ce morceau de code:

var features = app.Properties["server.Features"] as FeatureCollection;
var addresses = features.Get<IServerAddressesFeature>();
var address = addresses.Addresses.First();               
var uri = new Uri(address);

Il renvoie 127.0.0.1:16478 au lieu de localhost: 5600. Je pense que le premier utilisé par dotnet.exe et le second est IIS qui transfère 5600 à 16478. Comment puis-je obtenir localhost: 5600 dans Startup.cs?

12
Greedy

Je ne pense pas que ce soit possible car il existe généralement un proxy inverse dans la production qui gère l'adresse publique et l'application elle-même ne doit pas être exposée au public et, par conséquent, connaître l'adresse publique. Mais il peut y avoir quelques solutions:

  1. L'URL de lieu est une sorte de fichier de configuration qui peut être mis à jour pendant les étapes de déploiement pour avoir l'URL correcte.
  2. L'application peut obtenir l'URL complète de la demande comme ceci , donc après la première demande réelle à l'application, nous pouvons obtenir le nom d'hôte.
4
Pavel Oganesyan

Eh bien, il existe plusieurs solutions à ce problème. Votre adresse est la suivante:

string myurl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";

Il renvoie 127.0.0.1:16478 au lieu de localhost: 5600

Vous avez bien compris, oui. L'un vient de IIS et l'autre de dotnet. Donc, vous avez un problème pour essayer d'obtenir l'url correcte. Ok, alors que se passe-t-il si votre service est derrière le proxy inverse? https: //en.wikipedia.org/wiki/Reverse_proxy

Ensuite, votre service ne sera pas exposé directement à Internet, mais les demandes adressées à une URL spécifique seront transmises du proxy inverse à votre service. En outre, vous pouvez configurer le proxy inverse pour transférer des en-têtes supplémentaires qui spécifient la provenance de la demande d'origine. Je pense que la plupart des proxys inverses utilisent X-Forwarded-For (Certains utilisent X-Original-Host etc).

Donc, si vous avez un en-tête correct sur RP, vous pouvez obtenir une URL comme celle-ci:

url = url.RequestContext.HttpContext.Request.Headers["X-Forwarded-For"]

L'URL est de type UrlHelper. Pour simplifier cette méthode, vous pouvez créer une méthode d'extension (GetHostname (cette urlHelper url)), puis l'utiliser dans votre contrôleur ou où vous le souhaitez. J'espère que ça aide

3
golobich

[~ # ~] modifier [~ # ~] : J'ai relu votre question. Vous vouliez savoir comment faire cela dans Startup.cs. Vous pouvez, mais avec moins de solutions de rechange. Vos seuls choix sont la configuration ou la DNS.GetHostName() brute, qui n'est pas idéale. Au lieu de cela, lors de toute demande à votre service, enregistrez paresseusement votre API. C'est quand vous avez le contexte . Avant cela, votre service ne sait rien de Jon Snow. La première demande à votre API sera probablement un bilan de santé, ce qui déclenchera votre inscription auprès du consul.

Une solution que j'ai utilisée est une combinaison de configuration et d'en-têtes dans un scénario de secours.

Comptez d'abord sur l'en-tête X-Forwarded-For . S'il y a des cas où cela ne s'applique pas ou si vous en avez besoin ... vous pouvez revenir à la configuration.

Cela fonctionne pour votre cas d'utilisation, découverte . Cela dit, cela fonctionne également lorsque vous souhaitez générer des liens pour une raison quelconque (par exemple, pour l'hypermédia pour API JSON ou votre propre REST).

La solution de secours peut être utile en cas de reconfigurations et si vous disposez d'une source de configuration dynamique qui ne nécessite pas de redéploiement.

Dans le monde ASP.NET Core, vous pouvez créer une classe et l'injecter dans vos contrôleurs et services. Cette classe aurait une méthode qui sait d'abord essayer la configuration (pour voir si le remplacement est nécessaire) puis l'en-tête X-Forwarded-For, et si aucun n'est approprié, retournez à HttpContext.Request Pour obtenir les parties URI pertinentes .

Ce que vous faites, c'est permettre à votre API d'être sans contexte et de résilience (de changer) en lui donnant une certaine conscience contextuelle de l'endroit où "elle vit".

0
Kit