C# Web - localhost:port 有效,127.0.0.1:port 无效
Posted
技术标签:
【中文标题】C# Web - localhost:port 有效,127.0.0.1:port 无效【英文标题】:C# Web - localhost:port works, 127.0.0.1:port doesn't work 【发布时间】:2014-06-17 16:59:19 【问题描述】:我刚刚将 C# Web API 组件(Web API 模型和控制器)添加到现有项目的 localhost
副本中。
应从 android 应用调用此 Web API 的 GET 方法。在this link 中解释了我应该在Android Emulator 上使用10.0.2.2
来获取计算机的127.0.0.1
。
当我这样做时,它不适用于我在 Android 应用程序中的 HttpRequest。于是我就去安卓浏览器直接输入了,还是不行。
然后我尝试在计算机的浏览器中使用127.0.0.1
而不是localhost
,但由于某些未知原因它也不起作用..localhost
和127.0.0.1
之间有什么不同吗?我一直认为他们是一回事。
这是我在使用127.0.0.1
时得到的400 error
:
localhost
一切正常。
所以,我的问题是:如何在模拟器上使用localhost
(或者,如何解决使用127.0.0.1
而不是localhost
时出现的错误)?另外,我想知道localhost
和127.0.0.1
之间的区别,因为我一直认为它们是一样的。
提前感谢您的回复。
编辑 1:
在this *** question 中,他们提到了 Windows 的System32
中的主机文件。我用 Notepad++(以管理员身份)打开了这个文件,并用127.0.0.1 localhost
和::1 localhost
取消了注释。但不幸的是,这并没有解决问题,我仍然不能在我的计算机上使用127.0.0.1
来替代localhost
。可能是因为我的问题是相反的(我可以访问localhost
,但不能访问127.0.0.1
,而不是相反。)
编辑 2:
在this *** answer 中解释了localhost
和127.0.0.1
之间的区别是:
127.0.0.1
在某些编程语言中会更容易被识别为 IP。
localhost
可以更改为计算机主机文件中的另一个 IP(我的 Edit 1 中提到的文件)。
IPv4 和 IPv6 之间存在一些差异。
我现在有点明白其中的区别了,我只是不明白为什么我的 localhost 可以正常工作,但 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 端口配置并找到 the following site。在“为使用 Visual Studio 开发服务器的 Web 应用程序项目指定端口”部分,我按照说明将项目属性中的 Web 选项更改为 Use Visual Studio Development Server
,并使用我的 54408 port
.
这是朝着正确方向迈出的一大步,因为127.0.0.1:54408
主页现在可以使用。但是,一旦我尝试在 C# 网站上使用Google OAuth
登录,我就会收到以下错误:
我的一位从事 C# Web 项目的前同事曾经告诉我关于 this *** 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-urls。然后在我的 C# Web 项目的App_Start/AuthConfig.cs
中,我更改了客户端设置以使用这个新客户端。
再次感谢 Jake C 建议您在 Visual Studio 中更改 http port configurations
。这对我有用。
【问题讨论】:
您是否查看了 Windows32 文件夹中的 hosts 文件,可能那里有问题? localhost 是明确映射到 127.0.0.1 还是您在某个时候删除了它? @Jagga 是的,我做到了(见第一个编辑)。System32
hosts-file
中的所有内容都是注释,除了最后两行:127.0.0.1 localhost
和 ::1 localhost
。我在编辑 4 中添加了完整的文件。
试着把# 也注释到最后两行。在我的 hosts 文件中,他们被评论了,所以我假设他们默认被评论。
@Jagga 默认情况下,它们也曾经在我的文件中被注释掉。我确实尝试过像你说的那样再次评论它们,但我仍然得到相同的结果..
当某些浏览器看到带有“.”的 IP 地址时,您应该知道的一件事。而不是“localhost”,无论端口如何,它们都不会传递凭据。在 IE 中,当使用 127.0.0.1 地址时,它将不再像以前那样将凭据传递给服务器。因此,使用该环回地址会发生一些奇怪的事情。
【参考方案1】:
因此,HTTP 400 Invalid Hostname 错误通常意味着您没有设置网站集接受所有主机名和/或 IP 地址。我猜是因为这是您在 IIS 上托管的 C# 应用程序。要解决此问题,请打开 IIS 管理器(Win+R 并输入 inetmgr
),展开服务器,然后展开站点,然后右键单击托管应用程序的网站并选择绑定。在这个列表中应该有一个端口 54408 的 http 绑定,双击它。在 IP 地址下确保选中所有未分配,在主机名下确保该字段为空白。点击确定,然后关闭。该设置应立即生效,无需重置 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 上进入,都提供此服务网站。
【讨论】:
我的 C# 网站不是通过 IIS 托管的,inetmgr
在我的 PC 上不是有效命令。不过,我将在 Visual Studio 中查找端口的 http 绑定,因此感谢您的输入。也感谢您解释可能是什么原因。 +1
我确实在 Visual Studio 中找到了 Http port configurations
并设法让主页与 127.0.0.1
一起使用(参见编辑 5),所以已经非常感谢了。现在我只需要在获得主管的许可后在Google APIs Console
中修复redirect-urls
的问题即可。【参考方案2】:
这可能不是 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 并将数据从它重定向到它和本地主机
【讨论】:
【参考方案3】:我知道这是一个有点旧的帖子。但我的解决方案至少可以帮助某人几分钟。 如果您正在运行的网站上有多个绑定,请将其删除。只有一个 IP 地址:All Unassigned 和 HostName 设置为 Blank
【讨论】:
【参考方案4】:如果您使用 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 文件中创建一个新条目。
【讨论】:
【参考方案5】:在带有 IIS express 的 Visual Studio 2015 中: 首先在项目属性中将项目 url 从http://localhost:(Port 更改为否) 至:http://127.0.0.1:(Port 否)
然后点击创建可视目录
然后转到您的解决方案路径并打开“.vs”目录(目录已隐藏)并打开“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>
并将您的 Web 应用程序的最后一个绑定部分从 *:(Port No):localhost 更改为 *:(Port No):127.0.0.1
并停止 IIS Express 上所有正在运行的项目并重新启动它们。
【讨论】:
【参考方案6】:进入文件夹 .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 运行
【讨论】:
【参考方案7】:这对我在 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”
您可以随意更换端口【讨论】:
【参考方案8】:似乎自 Windows Vista 发布以来,Microsoft 已收回对“localhost”到您的内部计算机环回 IP 的“映射”的控制权。这就是为什么 现在在 Windows 7、8 和 10 中,主机文件中的那些 loopback/localhost 条目被注释掉了。这些解析的 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”添加到您的 II 绑定将解决此问题(请参阅其他海报)。 IIs Express 和 IIs 中的“所有 IP”设置在您本地盒子上的不同位置。您可能还需要在主机文件 (%systemroot%\system32\drivers\etc\hosts) 中添加回 IPv4 环回映射。同样,Windows 现在可以控制它,因此添加它可能是可选的。在我的盒子上“::1”是默认值。
【讨论】:
以上是关于C# Web - localhost:port 有效,127.0.0.1:port 无效的主要内容,如果未能解决你的问题,请参考以下文章
C#连接oracle数据库报“ORA-12154: TNS: 无法解析指定的连接标识符”错误看清楚内容再说哦!!
我在哪里可以在 Kesterl 代码中找到字符串:“现在正在侦听:http://localhost:port”?