我刚刚完成了向现有项目的localhost
副本添加C#Web API组件(Web API模型和控制器)。
此Web API的GET方法应该从Android应用程序调用。在此链接中解释了我应该使用Android Emulator上的10.0.2.2
来获取计算机的127.0.0.1
。
当我这样做的时候,它对我在Android应用程序中的HttpRequest不起作用。所以我去Android浏览器直接输入,它也不起作用。
然后我试着在我的计算机浏览器中使用127.0.0.1
而不是localhost
,但不知什么原因,它也不起作用.. localhost
和127.0.0.1
之间有什么不同吗?我一直认为它们是同一个。
下面是我使用127.0.0.1
时得到的400 error
:
而使用localhost
,一切都工作正常。
所以,我的问题是:如何在Emulator上使用localhost
(或者,如何修复使用127.0.0.1
而不是localhost
时出现的错误)?另外,我想知道localhost
和127.0.0.1
之间的区别,因为我一直认为它们是相同的。
提前感谢您的回复。
编辑1:
在this stackoverflow question中他们提到了Windows的System32
中的主机文件,我用记事本++打开了这个文件(作为管理员)并取消注解127.0.0.1 localhost
和::1 localhost
行。但不幸的是,这并没有解决问题,我仍然不能在我的计算机上使用127.0.0.1
作为localhost
的替代品。可能是因为我的问题是相反的(我可以访问localhost
,但不能访问127.0.0.1
,而不是相反。)
编辑二:
在this stackoverflow answer中,解释了localhost
和127.0.0.1
之间的差异:
127.0.0.1
在某些编程语言中更容易被识别为IP。localhost
可以在计算机的主机文件中更改为另一个IP(在我的 * Edit 1 * 中提到的文件)。- IPv4和IPv6之间存在一些差异。
All and all I kinda understand the differences now, I just don't get why my localhost is working, but 127.0.0.1 isn't..
编辑三:
它是否必须与port
有关(我使用54408
作为port
)?我已经打开了cmd
并进行了以下测试:
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
的4倍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
工作正常。
还是没人知道怎么解决这个问题吗
编辑四:
我的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端口配置,并找到了the following site。在"* 为使用Visual Studio Development Server的Web应用程序项目指定端口 *"部分,我按照说明将项目属性中的Web选项更改为54408 port
。
这是朝着正确方向迈出的重要一步,因为127.0.0.1:54408
主页现在可以正常工作了。然而,当我尝试用Google OAuth
登录C#网站时,我遇到了以下错误:
我的一个以前在C#web项目工作的同事曾经告诉我关于this stackoverflow post的事情,在这个帖子的回答中,我说我应该添加redirect-urls
(在我的例子中是127.0.0.1
)到Google APIs Console
。但是,现在我的localhost
项目还不能访问这个Console
,因为它是通过SVN
获得的。我将请求我的一位主管允许我查看此C#Web项目的Google APIs Console
,并可能编辑redirect-urls
以包含127.0.0.1
。
一旦我完全理解了这个问题,我就会接受Jake C的答案,因为他对Http port configurations
的解释确实帮助我找到了答案。
编辑6:
好了,我已经使用我自己的Google API控制台创建了一个新项目,并使用了新的客户端ID。我已经将http://localhost:54408/Account/ExternalLoginCallback
和http:127.0.0.1:54408/Account/ExternalLoginCallback
添加到redirect-url中。然后在我的C#Web项目的App_Start/AuthConfig.cs
中,我更改了客户端设置以使用这个新客户端。
再次感谢Jake C提出的在Visual Studio中修改http port configurations
的建议,这让我很满意。
8条答案
按热度按时间fnvucqvd1#
因此,HTTP 400无效主机名错误通常意味着您没有设置网站接受所有主机名和/或IP地址。我推测,因为这是一个C#应用程序,您在IIS上托管此。要修复此问题,请打开IIS管理器(Win+R并输入
inetmgr
),依次展开服务器和站点,然后右键单击应用程序所在的网站并选择绑定。在此列表中应该有一个端口54408的http绑定,双击这个。2在IP地址下确保所有未分配的被选中,在主机名下确保字段为空。3点击确定,然后关闭。4设置应该立即生效,而不需要重置IIS。如果您只是通过Visual Studio的内置Web部署来测试此功能,VS中的某些地方有与上述类似的设置(我对它有点生疏了,所以我记不清具体的位置和方式了)。或者,您可以在IIS中按照您想要的方式设置一个网站,然后让VS部署到该网站,而不是使用它自己的内部服务器。我认为这样做可能会有一些调试的缺点(再一次,我对细节有点模糊,当我记住它们或弄清楚时,我会编辑它们)。
关于为什么存在这些设置的一些背景知识:有时候,服务器需要托管多个站点,这些站点都需要通过端口80访问。假设我们有
foo.com
和bar.com
,它们太小,无法保证为这两个站点单独安装一台服务器。因此,它们都托管在IP地址为1.2.3.4
的服务器上。现在,当您在浏览器中输入URLfoo.com
并点击go时,它首先将主机名解析为1.2.3.4
,然后创建一个请求,该请求的一部分称为主机标头。主机标头中填充了输入的URL的主机名,在本例中为foo.com
。服务器收到请求后,将查看主机标头并返回foo.com
的内容。现在,如果你尝试在浏览器中输入
1.2.3.4
,它会创建一个主机头为空的请求,因为没有指定任何主机头。当服务器收到请求时,它不知道该怎么做,因为服务器托管了两个网站,并且没有主机头来指定浏览器要查找的网站,所以它会返回一个错误。这可能就是你的情况。你的网站是托管在
localhost
主机名下,任何其他请求都没有得到响应。我指定要更改的设置基本上是告诉服务器,无论IP地址是什么(网络接口)它进来的时候是在,而且不管它要找的主机名是什么,只要是在端口54408上进来的,就服务这个网站。i2loujxw2#
如果您使用的是Visual Studio的内置Web服务器(IIS Express),则默认情况下Maplocalhost;要启用127.0.0.1:
1)位于路径:%USERPROFILE%\文档\IISExpress\配置
2)定位配置文件:applicationhost.config
3)- 在编辑器中打开配置文件(我使用记事本++)
4)搜索站点端口,例如,如果URL通常为localhost:57578,则搜索“57578”,您应找到:
5)将此条目更改为:
6)保存并退出,重新启动网站。
注意:每当创建新的虚拟目录(更改端口号Project/Properties/Web/Project Url)时,您都需要重复此过程,这将在applicationhost.config文件中创建一个新条目。
vdzxcuhz3#
在Visual Studio 2015中使用IIS Express:首先在项目属性中将项目url从"否"更改为:否)
然后单击"创建可视目录
然后转到您的解决方案路径并打开". vs"目录(目录隐藏),然后打开"applicationhost.config"
and change last binding section of your web app from *:(Port No):localhost to *:(Port No):127.0.0.1
并停止IIS Express上所有正在运行的项目,然后重新启动它们。
llew8vvj4#
我知道这是一个有点旧的职位。但我的解决方案可以帮助别人至少几分钟的时间。如果你有一个以上的绑定在网站上,你正在运行删除它。有只有一个与IP地址:所有未分配且主机名设置为空白
rqcrx0a65#
在Visual Studio〉= 2017上,对于dotnet核心项目:
1-编辑项目中.vs\config内的applicationhost.config,并127.0.0.1为http和https添加www.example.com的绑定:
2-在vs中编辑iisexpress启动设置:从API项目树下的解决方案资源管理器
[your项目]〉属性〉启动设置.json:
确保在“应用程序URL”中使用https:“https://127.0.0.1:44380“
kjthegm66#
似乎自Windows Vista发布以来,Microsoft已重新控制“localhost”到内部计算机环回IP的“Map”。这就是为什么主机文件现在在Windows 7、8和10中将这些环回/localhost条目注解掉。这些解析的DNS控制现在发生在另一个TCP/IP传输层。主机文件仍然有效,它只是不是什么IP被Map到“本地主机”的“默认”。
这其中有多个原因,我读过,一个是多年前他们希望人们转移到IPv6,禁用IPv4,如果一个网络管理员这样做了,而用户仍然有IPv4条目,那就失败了,在2021年,向IPv6的转移还没有在那种级别上发生。但是Windows已经通过为你Map“localhost”向前迈进了一步。另一个原因是DNSSEC帮助解决的安全原因。我理解这个问题的方式是主机文件可能被恶意软件操纵。
许多Windows PC现在似乎将“localhost”解析为内部IP“::1”,而不是“127.0.0.1“。这是一个问题。另一个问题是“localhost”默认添加到所有服务器,但不是旧的IPv4环回地址,而旧的IPv4环回地址不是。将“所有未分配的IP”添加到您的II绑定将修复此问题(请参阅其他海报)。IIs Express和IIs中的“All IP 's”设置在本地设备上有不同的位置。您可能还需要在主机文件中添加回IPv4环回Map(%systemroot%\system32\drivers\etc\hosts)。同样,Windows现在控制它,所以添加它可能是可选的。在我的框中,“::1”是默认值。
wlzqhblo7#
进入文件夹YOUR_PROJECT/. vs/config,打开applicationhost. config并进行更改
to 127.0.0.1
And change this too, to run directly using 127.0.0.1
mepcadol8#
It's probably not an Android nor Windows issue. If you run your localhost by Visual Studio you will not get it available via 127.0.0.1
请尝试在计算机上设置IIS,然后从Visual Studio部署到IIS
或者,尝试UltiDev产品:http://ultidev.com/products/cassini/CassiniDevGuide.htmhttp://ultidev.com/products/UWS-Cassini-Pro/Default.aspx
有些人设法使用隧道,但我从来没有尝试过,也不知道该推荐什么。
Just something which listening to 127.0.0.1 and redirecting data from-to it and localhost