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,但由于某些未知原因它也不起作用..localhost127.0.0.1 之间有什么不同吗?我一直认为他们是一回事。

这是我在使用127.0.0.1 时得到的400 error

localhost 一切正常。

所以,我的问题是:如何在模拟器上使用localhost(或者,如何解决使用127.0.0.1 而不是localhost 时出现的错误)?另外,我想知道localhost127.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 中解释了localhost127.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/ExternalLoginCallbackhttp: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.combar.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 无效的主要内容,如果未能解决你的问题,请参考以下文章

在网络中访问 localhost Web 应用程序

指定URL地址。 Apache Tomcat

C#连接oracle数据库报“ORA-12154: TNS: 无法解析指定的连接标识符”错误看清楚内容再说哦!!

我在哪里可以在 Kesterl 代码中找到字符串:“现在正在侦听:http://localhost:port”?

错误请求 - 使用 localhost:port 以外的其他方式访问时主机名无效

无法检索在 Localhost:port python 上运行的 HTML 表单数据