android C# Web -本地主机:端口工作,127.0.0.1:端口不工作

6xfqseft  于 2022-12-25  发布在  Android
关注(0)|答案(8)|浏览(207)

我刚刚完成了向现有项目的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,但不知什么原因,它也不起作用.. localhost127.0.0.1之间有什么不同吗?我一直认为它们是同一个。
下面是我使用127.0.0.1时得到的400 error

而使用localhost,一切都工作正常。
所以,我的问题是:如何在Emulator上使用localhost(或者,如何修复使用127.0.0.1而不是localhost时出现的错误)?另外,我想知道localhost127.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中,解释了localhost127.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/ExternalLoginCallbackhttp:127.0.0.1:54408/Account/ExternalLoginCallback添加到redirect-url中。然后在我的C#Web项目的App_Start/AuthConfig.cs中,我更改了客户端设置以使用这个新客户端。
再次感谢Jake C提出的在Visual Studio中修改http port configurations的建议,这让我很满意。

fnvucqvd

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.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上进来的,就服务这个网站。

i2loujxw

i2loujxw2#

如果您使用的是Visual Studio的内置Web服务器(IIS Express),则默认情况下Maplocalhost;要启用127.0.0.1:
1)位于路径:%USERPROFILE%\文档\IISExpress\配置
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文件中创建一个新条目。

vdzxcuhz

vdzxcuhz3#

在Visual Studio 2015中使用IIS Express:首先在项目属性中将项目url从"否"更改为:否)
然后单击"创建可视目录
然后转到您的解决方案路径并打开". 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>

and change last binding section of your web app from *:(Port No):localhost to *:(Port No):127.0.0.1
并停止IIS Express上所有正在运行的项目,然后重新启动它们。

llew8vvj

llew8vvj4#

我知道这是一个有点旧的职位。但我的解决方案可以帮助别人至少几分钟的时间。如果你有一个以上的绑定在网站上,你正在运行删除它。有只有一个与IP地址:所有未分配且主机名设置为空白

rqcrx0a6

rqcrx0a65#

在Visual Studio〉= 2017上,对于dotnet核心项目:
1-编辑项目中.vs\config内的applicationhost.config,并127.0.0.1为http和https添加www.example.com的绑定:

<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-在vs中编辑iisexpress启动设置:从API项目树下的解决方案资源管理器
[your项目]〉属性〉启动设置.json:

"iisSettings": {
    ...
    "iisExpress": {
     **"applicationUrl": "https://127.0.0.1:44380",// make sure to use https**
      "sslPort": 44380
    }
  },

确保在“应用程序URL”中使用https:“https://127.0.0.1:44380“

  • 您可以根据需要更换端口
kjthegm6

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

wlzqhblo

wlzqhblo7#

进入文件夹YOUR_PROJECT/. vs/config,打开applicationhost. config并进行更改

<bindings>
     <binding protocol="http" bindingInformation="*:58670:localhost" />
</bindings>

to 127.0.0.1

<bindings>
     <binding protocol="http" bindingInformation="*:58670:127.0.0.1" />
</bindings>

And change this too, to run directly using 127.0.0.1

mepcadol

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

相关问题