web-dev-qa-db-fra.com

C # Web - localhost: le port fonctionne, 127.0.0.1::port ne fonctionne pas

Je viens de terminer l'ajout de composants API Web C # (Modèles et contrôleurs d'API Web) à une copie localhost d'un projet existant.

Les méthodes GET de cette API Web doivent être appelées à partir d'une application Android. Dans ce lien il est expliqué que je devrais utiliser 10.0.2.2 sur l'émulateur Android pour obtenir le 127.0.0.1 de l'ordinateur.

Lorsque j'ai fait cela, cela ne fonctionnait pas pour mon HttpRequest dans l'application Android. Je suis donc allé sur le navigateur Android et l'ai tapé directement, et cela n'a pas fonctionné non plus.

Ensuite, j'ai essayé d'utiliser 127.0.0.1 au lieu de localhost dans le navigateur de mon ordinateur. Pour une raison inconnue, cela ne fonctionne pas non plus. Existe-t-il une différence entre localhost et 127.0.0.1? J'ai toujours pensé qu'ils étaient identiques.

Voici le 400 error que j’obtiens lors de l’utilisation de 127.0.0.1: 127.0.0.1 error 400 bad request

Et avec localhost tout fonctionne bien.

Donc, ma question: comment utiliser localhost sur l'émulateur (ou comment corriger l'erreur que je reçois en utilisant 127.0.0.1 au lieu de localhost)? De plus, j'aimerais connaître la différence entre localhost et 127.0.0.1, car j'ai toujours pensé qu'ils étaient identiques.

Merci d'avance pour les réponses.


Modifier 1:

Dans cette question de stackoverflow ils mentionnent le fichier Host dans System32 de Windows. J'ai ouvert ce fichier avec Notepad ++ (en tant qu'administrateur) et je n'ai pas commenté les lignes avec 127.0.0.1 localhost et ::1 localhost. Malheureusement, le problème n’a pas été résolu et je ne peux toujours pas utiliser 127.0.0.1 sur mon ordinateur en remplacement de localhost. Probablement parce que mon problème est inversé (je peux accéder à localhost, mais pas 127.0.0.1, au lieu de l'inverse.)


Edit 2:

Dans cette réponse de stackoverflow il explique que les différences entre localhost et 127.0.0.1 sont les suivantes:

  • 127.0.0.1 sera plus facilement reconnu comme une adresse IP dans certains langages de programmation.
  • localhost peut être changé pour une autre adresse IP dans le fichier hôte de l'ordinateur (le fichier mentionné dans mon Edit 1).
  • Il existe certaines différences entre IPv4 et IPv6.

Tout compte fait, je comprends un peu les différences maintenant, je ne comprends tout simplement pas pourquoi mon hôte local fonctionne, mais 127.0.0.1 ne le fait pas ..


Edit 3:

Doit-il faire quelque chose avec la variable port (j'utilise 54408 comme port)? J'ai ouvert cmd et effectué les tests suivants: 

  • ping localhost: Je reçois une réponse avec 4 fois Reply from ::1: time<1ms.
  • ping 127.0.0.1: Je reçois une réponse avec 4 fois Reply from 127.0.0.1: bytes=32 time<1ms TIL=128
  • ping localhost:54408: Je reçois une erreur Ping request could not find localhost:54408. Please check the name and try again.
  • ping 127.0.0.1:54408: Je reçois une erreur Ping request could not find 127.0.0.1:54408. Please check the name and try again.

Et comme je l'ai déjà dit: 127.0.0.1:54408 dans le navigateur donne l'erreur vue dans l'image ci-dessus. Et localhost:54408 fonctionne très bien ..

Toujours personne avec une idée sur la façon de résoudre ce problème?


Edit 4:

Copie de mon hosts-file, situé dans C:\Windows\System32\drivers\etc.

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to Host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding Host name.
# The IP address and the Host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client Host

# localhost name resolution is handled within DNS itself.
127.0.0.1   localhost
::1         localhost

Les deux dernières lignes étaient:

#      127.0.0.1     localhost
#      ::1           localhost

Edit 5/Semi-Solution:

Après la suggestion de Jake C, je suis allé à la recherche de la configuration du port de Visual Studio et j'ai trouvé le site suivant . Dans la section "Pour spécifier un port pour un projet d'application Web utilisant le serveur de développement Visual Studio", j'ai suivi les instructions et modifié l'option Web dans les propriétés du projet en Use Visual Studio Development Server avec mon 54408 port.

C’était un grand pas dans la bonne direction puisque la page d’accueil de 127.0.0.1:54408 fonctionne maintenant. Cependant, une fois que j’essayais de me connecter avec le Google OAuth sur le site Web C #, j’obtenais l’erreur suivante: enter image description here

Un de mes ex-collègues qui a travaillé sur le projet Web C # m'a parlé une fois de ce post stackoverflow . Dans la réponse de cet article, il est indiqué que je devrais ajouter le redirect-urls (dans mon cas, 127.0.0.1) au Google APIs Console. Pour l'instant, je n'ai pas accès à cette Console pour mon projet localhost, car elle est obtenue via SVN. Je demanderai à l'un de mes superviseurs l'autorisation d'afficher le Google APIs Console de ce projet Web C # et éventuellement de modifier le redirect-urls pour inclure 127.0.0.1.

Une fois que tout fonctionne parfaitement, j'accepte la réponse de Jake C, car son explication du Http port configurations m'a effectivement aidé à trouver la réponse.


Edit 6:

D'accord, j'ai utilisé ma propre console API Google et créé un nouveau projet avec un nouvel ID client. J'ai ajouté le http://localhost:54408/Account/ExternalLoginCallback et le http:127.0.0.1:54408/Account/ExternalLoginCallback aux URL de redirection. Puis, dans le App_Start/AuthConfig.cs de mon projet Web C #, j'ai modifié les paramètres du client pour utiliser ce nouveau client.

Encore une fois, merci à Jake C pour votre suggestion de changer le http port configurations dans Visual Studio. Cela a fait le tour pour moi.

30
Kevin Cruijssen

En règle générale, une erreur HTTP 400 Invalid Hostname signifie généralement que le site Web ne doit pas accepter tous les noms d’hôte et/ou adresses IP. Je suppose que, parce qu’il s’agit d’une application C #, vous hébergez ceci sur IIS. Pour résoudre ce problème, ouvrez le Gestionnaire IIS (Win + R et entrez inetmgr), développez le serveur, puis Sites, puis cliquez avec le bouton droit de la souris sur le site Web où votre application est hébergée et sélectionnez des liaisons. Dans cette liste, il devrait y avoir une liaison http pour le port 54408, double-cliquez dessus. Sous Adresse IP, assurez-vous que l'option Toutes non attribuées est sélectionnée et sous Nom de l'hôte, vérifiez que le champ est vide. Hit OK, puis Fermer. Le paramètre doit prendre effet immédiatement sans qu'il soit nécessaire de réinitialiser IIS.

Si vous testez cela uniquement via le déploiement Web intégré de Visual Studio, il existe des paramètres similaires à ceux décrits ci-dessus quelque part dans VS (je suis un peu rouillé à ce sujet, donc je ne me souviens pas exactement où et comment). Vous pouvez également configurer un site Web dans IIS exactement comme vous le souhaitez, puis demander à VS de se déployer sur ce site Web au lieu d'utiliser son propre serveur interne. Cependant, je pense qu’il pourrait y avoir quelques inconvénients au débogage à le faire de cette façon (encore une fois, je suis un peu flou sur les détails, je les éditerai lorsque je me souviendrai d’eux ou que je le découvrirai).

Quelques explications sur la raison de l’existence de ces paramètres: Parfois, un serveur doit héberger plusieurs sites accessibles via le port 80. Supposons donc que nous avons foo.com et bar.com et qu’ils sont trop petits pour justifier l’obtention d’un serveur séparé. pour eux deux. Ils sont donc tous deux hébergés sur un serveur avec une adresse IP de 1.2.3.4. Désormais, lorsque vous entrez l'URL foo.com dans le navigateur et que vous appuyez sur OK, le nom de l'hôte est d'abord résolu en 1.2.3.4, puis une demande est créée et une partie de cette demande est appelée l'en-tête de l'hôte. L'en-tête de l'hôte est rempli avec le nom d'hôte de l'URL entrée, dans ce cas foo.com. Lorsque la demande est reçue par le serveur, celui-ci examine l'en-tête de l'hôte et renvoie le contenu pour foo.com.

Désormais, si vous tentiez de saisir 1.2.3.4 dans le navigateur, une requête avec un en-tête d'hôte vierge serait créée, car aucune n'était spécifiée. Lorsque la demande est reçue par le serveur, le serveur ne sait pas quoi faire, car le serveur héberge deux sites Web et aucun en-tête d'hôte ne permet de spécifier celui que le navigateur recherche. Par conséquent, il renvoie une erreur.

C'est probablement ce qui se passe dans votre situation. Votre site web est hébergé sous le nom d'hôte localhost et aucune autre demande n'est traitée. Les paramètres que j'ai spécifiés pour le changer indiquent en gros au serveur que, quelle que soit l'adresse IP (interface réseau) sur laquelle il est connecté, quel que soit le nom d'hôte recherché, dès lors qu'il arrive sur le port 54408, site Internet.

8
Jake C

Dans Visual Studio 2015 avec IIS, exprimez: Premier dans les propriétés du projet, changez l'URL du projet à partir de http: // localhost: (Port No) à: http://127.0.0.1:(Port No)

et cliquez sur Create Visual Directory

ensuite, accédez au chemin de votre solution et ouvrez le répertoire ".vs" (le répertoire est caché), puis ouvrez le fichier "applicationhost.config".

<sites>
        <site name="WebSite1" id="1" serverAutoStart="true">
            <application path="/">
                <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation=":8080:localhost" />
            </bindings>
        </site>
        <site name="####" id="2">
            <application path="/" applicationPool="Clr4IntegratedAppPool">
                <virtualDirectory path="/" physicalPath="E:\Visual Studio 2015\Projects\####\####" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:5050:localhost" />
            </bindings>
        </site>
        <site name="####(1)" id="3">
            <application path="/" applicationPool="Clr4IntegratedAppPool">
                <virtualDirectory path="/" physicalPath="E:\Visual Studio 2015\Projects\####\####" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:5050:127.0.0.1" />
            </bindings>
        </site>
        <siteDefaults>
            <logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
            <traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
        </siteDefaults>
        <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
        <virtualDirectoryDefaults allowSubDirConfig="true" />
    </sites>

et changez la dernière section de reliure de votre application Web de * :( No du port): localhost à * :( No du port): 127.0.0.1 

et arrêtez tous les projets en cours sur IIS Express et redémarrez-les.

9
Hamed Mahdizadeh

Si vous utilisez le serveur Web intégré de Visual Studio (IIS Express), localhost est mappé par défaut. pour activer 127.0.0.1:

1) Sur le chemin:% USERPROFILE%\Documents\IISExpress\config

2) Localisez le fichier de configuration: applicationhost.config

3) - ouvrir le fichier de configuration dans l'éditeur (j'utilise notepad ++)

4) Recherchez le port du site, par exemple si l’URL est typiquement localhost: 57578, recherchez "57578" et vous devriez trouver:

<binding protocol="http" bindingInformation="*:57578:localhost" />

5) Remplacez cette entrée par:

<binding protocol="http" bindingInformation="*:57578:*" />

6) Enregistrez et quittez, redémarrez le site Web.

Remarque: vous souhaiterez répéter ce processus chaque fois que vous créez un nouveau répertoire virtuel (en modifiant le numéro de port Projet/Propriétés/Web/URL du projet), ce qui crée une nouvelle entrée dans le fichier applicationhost.config.

9
Mick Owen

Je sais que c'est un peu vieux post. Mais ma solution pourrait aider quelqu'un au moins quelques minutes… .. Si vous avez plusieurs liaisons sur le site Web que vous exécutez, supprimez-le. Un seul avec l'adresse IP: Tous non attribués et Nom d'hôte défini sur Viergeenter image description here

1
Saifur

Ce n'est probablement pas un problème Android ni Windows. Si vous exécutez votre hôte local par Visual Studio, il ne sera pas disponible via 127.0.0.1.

Essayez plutôt de définir IIS sur votre ordinateur, puis déployez-le de Visual Studio vers IIS.

Vous pouvez également essayer les produits UltiDev: http://ultidev.com/products/cassini/CassiniDevGuide.htmhttp://ultidev.com/products/UWS-Cassini-Pro/Default .aspx

Certaines personnes ont réussi à utiliser le tunneling, mais je ne l'ai jamais essayé et je ne sais pas quoi recommander.

Juste quelque chose qui écoute 127.0.0.1 et redirige les données de celui-ci et localhost

0
user942217

Allez dans le dossier .vs/config et ouvrez applicationhost.config et changez 

<bindings>
     <binding protocol="http" bindingInformation="*:58670:localhost" />
</bindings>

à 127.0.0.1

<bindings>
     <binding protocol="http" bindingInformation="*:58670:127.0.0.1" />
</bindings>

Et changez cela aussi, pour exécuter directement en utilisant 127.0.0.1

 enter image description here

0
gorums