С# Web - localhost: порт работает, 127.0.0.1:port не работает
Я только что добавил компоненты С# Web API (модели и контроллеры веб-интерфейсов) к копии существующего проекта localhost
.
Этот веб-API GET-методы следует вызывать из приложения для Android. В эта ссылка объяснила, что я должен использовать 10.0.2.2
в эмуляторе Android, чтобы получить компьютер 127.0.0.1
.
Когда я это сделал, это не сработало для моего HttpRequest в приложении для Android. Поэтому я пошел в браузер Android и набрал его напрямую, и он также не работал.
Затем я попытался использовать 127.0.0.1
вместо localhost
в своем браузере компьютера, и по какой-то неизвестной причине он также не работает. Есть ли разница между localhost
и 127.0.0.1
? Я всегда думал, что они были одним и тем же.
Вот 400 error
я получаю при использовании 127.0.0.1
:
![127.0.0.1 error 400 bad request]()
И с localhost
все работает нормально.
Итак, мой вопрос: как я могу использовать localhost
в эмуляторе (или, как я могу исправить ошибку, которую я получаю при использовании 127.0.0.1
вместо localhost
)? Кроме того, я хотел бы знать разницу между localhost
и 127.0.0.1
, так как я всегда думал, что они были одинаковыми.
Заранее благодарим за ответы.
Изменить 1:
В qaru.site/info/202386/... они упоминают файл хоста в System32
Windows. Я открыл этот файл Notepad ++ (как Администратор) и раскомментировал строки с помощью 127.0.0.1 localhost
и ::1 localhost
. Но, к сожалению, это не устранило проблему, и я все еще не могу использовать 127.0.0.1
на своем компьютере в качестве замены для localhost
. Вероятно, потому что моя проблема - обратная (я могу получить доступ к localhost
, но не 127.0.0.1
, а не наоборот).
Изменить 2:
В qaru.site/info/63974/... он объяснил, что различия между localhost
и 127.0.0.1
:
-
127.0.0.1
будет легче распознаваться как IP на некоторых языках программирования.
-
localhost
можно изменить на другой IP-адрес в хост файле компьютера (файл, указанный в моем Редактировании 1).
- Существуют некоторые различия между IPv4 и IPv6.
Всем и всем, что я сейчас понимаю разницы, я просто не понимаю, почему мой локальный хост работает, но 127.0.0.1 не..
Изменить 3:
Нужно ли что-то делать с port
(я использую 54408
как port
)? Я открыл cmd
и выполнил следующие тесты:
-
ping localhost
: Я получаю ответ с 4 раза Reply from ::1: time<1ms
.
-
ping 127.0.0.1
: я получаю ответ с 4 раза Reply from 127.0.0.1: bytes=32 time<1ms TIL=128
-
ping localhost:54408
: Я получаю сообщение об ошибке Ping request could not find localhost:54408. Please check the name and try again.
-
ping 127.0.0.1:54408
: Я получаю сообщение об ошибке Ping request could not find 127.0.0.1:54408. Please check the name and try again.
И, как я уже говорил раньше: 127.0.0.1:54408
в браузере дает ошибку, показанную на изображении выше. И localhost:54408
работает просто отлично.
По-прежнему никто не знает, как это исправить?
Изменить 4:
Скопируйте мой hosts-file
, расположенный в 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
Последние две строки:
# 127.0.0.1 localhost
# ::1 localhost
Изменить 5/Полу-решение:
После предложения Jake C я пошел искать конфигурацию порта Visual Studio и нашел следующий сайт. В разделе "Чтобы указать порт для проекта веб-приложения, использующего сервер разработки Visual Studio", я выполнил инструкции и изменил параметр "Веб" в "Свойства проекта" на Use Visual Studio Development Server
с помощью моего 54408 port
.
Это был отличный шаг в правильном направлении, так как теперь работает страница 127.0.0.1:54408
. Однако, как только я попытаюсь войти в систему с Google OAuth
на веб-сайте С#, я получил следующую ошибку:
![enter image description here]()
Один из моих бывших коллег, которые работали над веб-проектом С#, однажды сказал мне о qaru.site/info/25811/.... В ответе этого сообщения указано, что я должен добавить redirect-urls
(в моем случае 127.0.0.1
) в Google APIs Console
.
Прямо сейчас у меня нет доступа к этому Console
для моего проекта localhost
, так как он получен через SVN
. Я попрошу одного из моих наблюдателей получить разрешение на просмотр Google APIs Console
этого веб-проекта С# и, возможно, отредактировать redirect-urls
, чтобы включить 127.0.0.1
.
Как только у меня все получится, я соглашусь ответить Джейком С, поскольку его объяснение Http port configurations
действительно помогло мне найти ответ.
Изменить 6:
Хорошо, я использовал свою собственную консоль API Google и создал новый проект с новым идентификатором клиента. Я добавил теги http://localhost:54408/Account/ExternalLoginCallback
и http:127.0.0.1:54408/Account/ExternalLoginCallback
к URL-адресам перенаправления. Затем в моем веб-проекте С# App_Start/AuthConfig.cs
я изменил настройки клиента, чтобы использовать этот новый клиент.
Еще раз спасибо Jake C за ваше предложение изменить Http port configurations
в Visual Studio. Это сделало трюк для меня.
Ответы
Ответ 1
Таким образом, как правило, ошибка HTTP 400 Invalid Hostname обычно означает, что у вас нет веб-сайта, который принимает все имена хостов и/или IP-адреса. Я предполагаю, что это приложение С#, которое вы размещаете в IIS. Чтобы исправить этот открытый диспетчер IIS (Win + R и введите inetmgr
), разверните сервер, затем "Сайты", затем щелкните правой кнопкой мыши веб-сайт, на котором размещено ваше приложение, и выберите привязки. В этом списке должна быть привязка http для порта 54408, дважды щелкните по этому значку. Под IP-адресом убедитесь, что выбрано значение All Unassigned, и под именем Host убедитесь, что поле пустым. Нажмите "ОК", затем "Закрыть". Настройка должна вступить в силу немедленно, без использования reset IIS.
Если вы тестируете это только через Visual Studio, встроенную в веб-развертывание, аналогичные настройки имеют место выше в VS (я немного ржавый, поэтому я не могу точно запомнить, где и как). В качестве альтернативы вы можете настроить веб-сайт в IIS точно так, как вы хотите, а затем развертывать VS на этом веб-сайте, а не использовать собственный внутренний сервер. Я думаю, что могут быть некоторые недостатки отладки, чтобы сделать это таким образом, хотя (еще раз я немного нечеткий по деталям, я буду редактировать их, когда я их помню или выясню).
Немного о том, почему эти настройки существуют:
Иногда серверу необходимо разместить несколько сайтов, к которым все будут доступны через порт 80. Так что скажем, что у нас есть foo.com
и bar.com
, и они слишком малы, чтобы гарантировать получение отдельного сервера для обоих из них. Поэтому вместо этого они размещаются на сервере с IP-адресом 1.2.3.4
. Теперь, когда вы введете URL-адрес foo.com
в браузер и нажмите "go", сначала он разрешает имя узла 1.2.3.4
, а затем создает запрос, а часть этого запроса называется заголовком хоста. Заголовок хоста заполняется именем хоста введенного URL, в данном случае foo.com
. Когда запрос получен сервером, он смотрит на заголовок узла и возвращает содержимое для foo.com
.
Теперь, если вы попытаетесь ввести 1.2.3.4
в браузер, он создаст запрос с пустым заголовком хоста, потому что ничего не указано. Когда запрос получен сервером, он не знает, что делать, потому что на сервере размещены два веб-сайта, и нет заголовка хоста, чтобы указать, какой браузер ищет, поэтому вместо этого он возвращает ошибку.
Вероятно, это то, что происходит в вашей ситуации. Ваш веб-сайт размещается под именем localhost
, и на любой другой запрос не отвечает. Настройки, которые я указал для изменения, в основном говорят серверу, что независимо от того, какой IP-адрес (сетевой интерфейс) он входит в систему, и независимо от того, какое имя хоста он ищет, пока он входит в порт 54408, сайт.
Ответ 2
Если вы используете Visual Studio, встроенную в веб-сервер (IIS Express), localhost отображается по умолчанию; для включения 127.0.0.1:
1) На пути:% USERPROFILE%\Documents\IISExpress\config
2) Найдите файл конфигурации: applicationhost.config
3) - открыть файл конфигурации в редакторе (я использую блокнот ++)
4) Найдите порт сайта, например, если URL-адрес обычно является localhost: 57578, выполните поиск "57578", и вы должны найти:
<binding protocol="http" bindingInformation="*:57578:localhost" />
5) Измените эту запись на:
<binding protocol="http" bindingInformation="*:57578:*" />
6) Сохранить и выйти, перезапустить веб-сайт.
Примечание. Вы захотите повторить этот процесс при создании нового виртуального каталога (измените номер порта Project/Properties/Web/Project Url), который создает новую запись в файле applicationhost.config.
Ответ 3
В visual studio 2015 с IIS express:
сначала в свойствах проекта измените URL проекта из http://localhost:(Port Нет)
to: http://127.0.0.1:(Port Нет)
и нажмите "Создать визуальный каталог"
затем перейдите к пути решения и откройте ".vs" dirctory (каталог скрыт) и откройте "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>
и изменить последний раздел привязки вашего веб-приложения от *:( Port No): localhost to *:( Port No): 127.0.0.1
и остановите все запущенные проекты на IIS Express и перезапустите их.
Ответ 4
Я знаю это немного старый пост. Но мое решение могло помочь кому-то хотя бы на несколько минут.
Если на веб-сайте, на котором вы работаете, есть несколько привязок, удалите его. У вас есть только один с IP-адресом: All Unassigned и HostName установлены на Blank ![enter image description here]()
Ответ 5
Вероятно, это не проблема Android и Windows. Если вы запустите свой localhost с помощью Visual Studio, вы не сможете получить его через 127.0.0.1
Вместо этого попробуйте установить IIS на свой компьютер, затем разверните из Visual Studio в IIS
Кроме того, попробуйте продукты UltiDev:
http://ultidev.com/products/cassini/CassiniDevGuide.htm
http://ultidev.com/products/UWS-Cassini-Pro/Default.aspx
Некоторым людям удалось использовать туннелирование, но я никогда не пробовал и не знал, что рекомендовать.
Просто то, что прослушивает 127.0.0.1 и перенаправляет данные из-на него и localhost