我刚刚将C#Web API组件(Web API模型和控制器)添加到现有项目的localhost
副本中。
应该从Android应用程序调用此Web API的GET方法。在this link中解释说,我应该在Android模拟器上使用10.0.2.2
来获取计算机的127.0.0.1
。
当我这样做时,它在Android应用中对我的HttpRequest不起作用。所以我去了Android浏览器并直接键入它,它也没有用。
然后我尝试在我的计算机浏览器中使用127.0.0.1
而不是localhost
,并且由于某些未知原因,它也无效。localhost
和{{之间是否存在差异1}?我一直以为他们是同一个人。
以下是使用127.0.0.1
时获得的400 error
:
使用127.0.0.1
一切正常。
所以,我的问题是:如何在模拟器上使用localhost
(或者,如何修复使用localhost
而不是127.0.0.1
时出现的错误?此外,我想知道localhost
和localhost
之间的区别,因为我一直认为它们是相同的。
提前感谢您的回复。
编辑1:
在this stackoverflow question中,他们提到了Windows 127.0.0.1
中的主机文件。我使用Notepad ++(作为管理员)打开此文件,并使用System32
和127.0.0.1 localhost
取消注释行。但不幸的是,这并没有解决问题,我仍然无法在我的计算机上使用::1 localhost
来代替127.0.0.1
。可能是因为我的问题是相反的(我可以访问localhost
,但不能访问localhost
,而不是相反。)
编辑2:
在this stackoverflow answer中,我们解释了127.0.0.1
和localhost
之间的区别是:
127.0.0.1
将更容易被识别为IP。127.0.0.1
可以更改为计算机主机文件中的另一个IP(我的编辑1 中提到的文件)。所有我现在都明白了这些差异,我只是不明白为什么我的localhost正在工作,但127.0.0.1不是..
编辑3:
是否必须对localhost
执行某些操作(我将port
用作54408
)?我打开port
并做了以下测试:
cmd
:我收到4次ping localhost
的回复。Reply from ::1: time<1ms
:我收到4次ping 127.0.0.1
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
工作得很好..
仍然没有人知道如何解决这个问题?
编辑4:
位于localhost:54408
的{{1}}的副本。
hosts-file
最后两行是:
C:\Windows\System32\drivers\etc
编辑5 /半解决方案:
在Jake C的建议之后,我去寻找Visual Studio端口配置并找到了the following site。在“为使用Visual Studio开发服务器的Web应用程序项目指定端口”部分,我按照说明将项目属性中的Web选项更改为# 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
with { {1}}。
这是朝着正确方向迈出的一大步,因为# 127.0.0.1 localhost
# ::1 localhost
主页现在有效。但是,一旦我尝试使用C#网站上的Use Visual Studio Development Server
登录,我就会收到以下错误:
我的一位曾在C#网络项目上工作过的前同事曾告诉过我this stackoverflow post。在这篇文章的答案中声明我应该将54408 port
(在我的情况下为127.0.0.1:54408
)添加到Google OAuth
。
目前,我无法访问redirect-urls
项目的127.0.0.1
,因为它是通过Google APIs Console
获得的。我将要求我的一位主管允许查看此C#网络项目的Console
,并可能编辑localhost
以包含SVN
。
一旦我完全开始工作,我会接受Jake C的回答,因为他对Google APIs Console
的解释确实帮助我找到答案。
编辑6:
好的,我使用了自己的Google API控制台,并使用新的客户端ID创建了一个新项目。我已将redirect-urls
和127.0.0.1
添加到redirect-urls。然后在我的C#web项目Http port configurations
中,我更改了客户端设置以使用此新客户端。
再次感谢Jake C的建议,即在Visual Studio中更改http://localhost:54408/Account/ExternalLoginCallback
。这对我有用。
答案 0 :(得分:12)
如果您使用的是Visual Studio的内置Web服务器(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文件中创建新条目。
答案 1 :(得分:9)
通常,HTTP 400无效主机名错误通常意味着您没有网站集接受所有主机名和/或IP地址。我推测,因为这是一个C#应用程序,你在IIS上托管它。要修复此问题,请打开IIS管理器(Win + R并输入inetmgr
),展开服务器,然后展开“站点”,然后右键单击托管应用程序的网站并选择绑定。在此列表中应该有端口54408的http绑定,双击它。在IP地址下,确保选中“所有未分配”,并在“主机名”下确保该字段为空。点击OK,然后关闭。该设置应立即生效,无需重置IIS。
如果您只是通过Visual Studio内置的Web部署对此进行测试,那么在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 :(得分:1)
我知道这有点老了。但我的解决方案可以帮助某人至少几分钟的时间。 如果您在运行的网站上有多个绑定,请将其删除。只有一个具有IP地址:所有未分配和主机名设置为空
答案 3 :(得分:0)
这可能不是Android或Windows问题。如果您通过Visual Studio运行localhost,则无法通过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
答案 4 :(得分:0)
进入文件夹.vs / config并打开applicationhost.config并更改
<bindings>
<binding protocol="http" bindingInformation="*:58670:localhost" />
</bindings>
至127.0.0.1
<bindings>
<binding protocol="http" bindingInformation="*:58670:127.0.0.1" />
</bindings>
也更改此设置,以直接使用127.0.0.1运行
答案 5 :(得分:0)
这对我来说适用于Visual Studio> = 2017,适用于dotnet核心项目:
1-在项目中的.vs \ config内编辑applicationhost.config,并为http和https添加127.0.0.1的绑定:
<sites>
...
<site name="Api" id="3"> <!-- your api project -->
...
<bindings>
<binding protocol="https" bindingInformation="*:44380:localhost" />
<binding protocol="http" bindingInformation="*:55555:localhost" />
<binding protocol="https" bindingInformation="*:44380:127.0.0.1" />
<binding protocol="http" bindingInformation="*:55555:127.0.0.1" />
</bindings>
</site>
...
</sites>
2-在api项目树下的解决方案资源管理器中,在vs:中编辑iisexpress启动设置
[您的项目]>属性> launchSettings.json:
"iisSettings": {
...
"iisExpress": {
**"applicationUrl": "https://127.0.0.1:44380",// make sure to use https**
"sslPort": 44380
}
},
确保在“ applicationUrl”中使用https:“ https://127.0.0.1:44380”
答案 6 :(得分:0)
看来,自从 Windows Vista 发布以来,Microsoft 已经收回了对“localhost”到您的内部计算机环回 IP 的“映射”的控制权。这就是为什么主机文件现在在 Windows 7、8 和 10 中注释掉了那些环回/本地主机条目。这些解析的 DNS 控制现在发生在另一个 TCP/IP 传输层中。主机文件仍然有效,只是它不是 IP 映射到“localhost”的“默认”。
这有多种原因,我已经阅读过。一是几年前他们希望人们转向 IPv6 并禁用 IPv4。如果网络管理员这样做,而用户仍然有 IPv4 条目,他们就会失败。到 2021 年,向 IPv6 的转变仍然没有发生在那种级别。但是 Windows 通过为您映射“localhost”而向前发展。另一个原因是 DNSSEC 帮助解决的安全原因。我理解这个问题的方式是主机文件可能被恶意软件操纵。
许多 Windows PC 现在似乎将“localhost”解析为“::1”的内部 IP,而不是“127.0.0.1”。这是一个问题。另一个是默认情况下将“localhost”添加到所有服务器的事实,而不是旧的 IPv4 环回地址。将“所有未分配的 IP”添加到您的 IIs 绑定将解决此问题(请参阅其他海报)。本地机器上的 IIs Express 和 IIs 中的“所有 IP”设置有不同的位置。您可能还需要在主机文件 (%systemroot%\system32\drivers\etc\hosts) 中添加回 IPv4 环回映射。同样,Windows 现在控制它,因此添加它可能是可选的。在我的盒子上,“::1”是默认值。