8
votes

Obtenir le nom d'hôte sans utiliser httpequest

Je veux exécuter un "travail de fond" dans mon application ASP.NET (périodiquement, comme thread séparé). Et j'ai besoin de nom d'hôte (nom DNS ou IP) pour faire mes tâches. Le problème est que le httpcontext.current ne peut pas être disponible ici (c'est null ).

Y a-t-il un moyen d'obtenir un nom d'hôte dans sans utiliser httpcontext.current.request.url.host .


1 commentaires

Au début, je pensais que dns.gethostname (), mais qui renvoie le nom d'hôte de la machine, pas nécessairement l'URL hôte de la demande (c'est-à-dire si vous avez plusieurs liaisons dans IIS). Si tout ce dont vous avez besoin est le nom de l'hôte de la machine, vous pouvez utiliser dns.gethostname ()


4 Réponses :


8
votes

Lorsque le nom d'hôte est disponible dans httpcontext.request.url.host code>, il résulte du nom d'hôte faisant partie de la demande envoyée par le client. À titre d'exemple, prenez une demande à cette page:

GET /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1
Host: stackoverflow.com
...


3 commentaires

+1 pour NCron Link, j'aimerais avoir connu cela à ce sujet un moment.


Salut Jorn, pourriez-vous participer à des détails sur pourquoi la planification des travaux réguliers dans un thread de fond est généralement une mauvaise idée? À condition que les travaux ne soient pas très intenses de ressources et que celui-ci ne prennent pas trop de discussions précieuses du serveur, quel problème attendriez-vous? Je demande parce que j'ai récemment développé une telle solution et n'avait pas encore de problème.


@Adriangriggore Vous êtes un piscine d'applications pourraient être recyclés à des moments imprévus et en l'absence de demandes que vos travailleurs ne peuvent pas courir. Autre que cela, je considère également cela possible et dans de nombreux cas une approche raisonnable. J'aime particulièrement le déploiement facile qui vient avec elle.



1
votes

Vous pouvez probablement ajouter une variable de classe dans votre classe de thread et définir cette variable avec demande.url.host avant d'exécuter la classe de thread.

Cette méthode peut également s'appliquer à l'objet de session.


1 commentaires

Dans ce cas, j'ai besoin d'attendre au moins une requête et seulement puis de commencer le travail. Pas bon. Qu'est-ce que vous voulez dire "appliquer à la session"? Je n'ai pas accès à la session, car je n'ai pas httpcontext.



1
votes

Gardez à l'esprit que c'est une mauvaise idée d'initier ce «travail de fond» à partir d'une application Web si vous avez besoin de l'exécution de 24 heures sur 24, 7j / 7 de manière indépendante. Même si vous le démarrez dans un nouveau fil. Votre application Web peut n'avoir aucune demande de quelque temps. Dans ce cas, le temps d'exécution fermera le processus et tous ses threads "enfant". Pour une exécution continue, vous devez l'exécuter en tant que service Windows. Sinon, la Darren a raison, utilisez le système.net.dns.gethostName ().


0 commentaires

0
votes

J'utilise la même approche que vous pour la planification des tâches régulières et que j'ai travaillé autour de cela consiste à stocker le nom de la machine pour une utilisation ultérieure lorsque l'application reçoit une requête Web.

C'est un piratage plutôt sale, mais le seul moyen de le faire à moins que vous ne vouliez que vous souhaitez le signaler ou la récupérer à partir d'un fichier de configuration externe, trop dangereux (peu fiable) à mes fins.


0 commentaires