C#Web - localhost:端口工作,127.0.0.1:port不起作用

时间:2014-05-01 07:41:21

标签: c# android asp.net-web-api android-emulator localhost

我刚刚将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 error127.0.0.1 error 400 bad request

使用127.0.0.1一切正常。

所以,我的问题是:如何在模拟器上使用localhost(或者,如何修复使用localhost而不是127.0.0.1时出现的错误?此外,我想知道localhostlocalhost之间的区别,因为我一直认为它们是相同的。

提前感谢您的回复。


编辑1:

this stackoverflow question中,他们提到了Windows 127.0.0.1中的主机文件。我使用Notepad ++(作为管理员)打开此文件,并使用System32127.0.0.1 localhost取消注释行。但不幸的是,这并没有解决问题,我仍然无法在我的计算机上使用::1 localhost来代替127.0.0.1。可能是因为我的问题是相反的(我可以访问localhost,但不能访问localhost,而不是相反。)


编辑2:

this stackoverflow answer中,我们解释了127.0.0.1localhost之间的区别是:

    在某些编程语言中,
  • 127.0.0.1将更容易被识别为IP。
  • 127.0.0.1可以更改为计算机主机文件中的另一个IP(我的编辑1 中提到的文件)。
  • IPv4和IPv6之间存在一些差异。

所有我现在都明白了这些差异,我只是不明白为什么我的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登录,我就会收到以下错误: enter image description here

我的一位曾在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-urls127.0.0.1添加到redirect-urls。然后在我的C#web项目Http port configurations中,我更改了客户端设置以使用此新客户端。

再次感谢Jake C的建议,即在Visual Studio中更改http://localhost:54408/Account/ExternalLoginCallback。这对我有用。

7 个答案:

答案 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.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上进入,请为此服务网站。

答案 2 :(得分:1)

我知道这有点老了。但我的解决方案可以帮助某人至少几分钟的时间。 如果您在运行的网站上有多个绑定,请将其删除。只有一个具有IP地址:所有未分配和主机名设置为空enter image description here

答案 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运行

enter image description here

答案 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”是默认值。