C#Web-localhost:port-works,127.0.0.1:port-donds';行不通
我刚刚将C#WebAPI组件(WebAPI模型和控制器)添加到现有项目的C#Web-localhost:port-works,127.0.0.1:port-donds';行不通,c#,android,asp.net-web-api,android-emulator,localhost,C#,Android,Asp.net Web Api,Android Emulator,Localhost,我刚刚将C#WebAPI组件(WebAPI模型和控制器)添加到现有项目的localhost副本中 应该从Android应用程序调用此Web API的GET方法。在它的解释中,我应该在Android仿真器上使用10.0.2.2来获得计算机的127.0.0.1 当我这么做的时候,它在Android应用程序中对我的HttpRequest不起作用。所以我去安卓浏览器直接输入了它,但它也不起作用 然后我尝试在我的电脑浏览器中使用127.0.0.1而不是localhost,但不知什么原因,它也不起作用。。l
localhost
副本中
应该从Android应用程序调用此Web API的GET方法。在它的解释中,我应该在Android仿真器上使用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错误:
使用localhost
一切正常
因此,我的问题是:如何在模拟器上使用localhost
(或者,如何修复使用127.0.0.1
而不是localhost
时出现的错误)?另外,我想知道localhost
和127.0.0.1
之间的区别,因为我一直认为它们是一样的
提前感谢您的回复
编辑1:
在中,他们提到了Windows的System32
中的主机文件。我用记事本++(作为管理员)打开了这个文件,并用127.0.0.1 localhost
和::1 localhost
取消了对行的注释。但不幸的是,这并没有解决问题,我仍然无法在我的计算机上使用127.0.0.1
来替代localhost
。可能是因为我的问题正好相反(我可以访问localhost
,但不能访问127.0.0.1
,反之亦然。)
编辑2:
其中解释了localhost
和127.0.0.1
之间的区别:
- 在某些编程语言中,
127.0.0.1
将更容易被识别为IP
localhost
可以更改为计算机主机文件(我的编辑1中提到的文件)中的另一个IP
- IPv4和IPv6之间存在一些差异
我现在有点理解这些区别了,我只是不明白为什么我的本地主机可以工作,但是127.0.0.1不能
编辑3:
它是否与端口
(我使用54408
作为端口
)有关?我打开了cmd
并进行了以下测试:
ping localhost
:我收到了来自::1:time的4次回复,因此通常HTTP 400无效主机名错误通常意味着您没有将网站设置为接受所有主机名和/或IP地址。我想这是因为这是一个C#应用程序,您正在IIS上托管它。要修复此问题,请打开IIS管理器(Win+R并输入inetmgr
),先展开服务器,然后展开站点,然后右键单击应用程序所在的网站并选择绑定。在此列表中,端口54408应该有一个http绑定,双击此链接。在“IP地址”下,确保选中“所有未分配”,在“主机名”下,确保字段为空。点击OK,然后关闭。设置应立即生效,无需重置IIS
如果您只是通过VisualStudio的内置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上,就可以为这个网站服务。这可能不是安卓或Windows的问题。如果通过Visual Studio运行localhost,则无法通过127.0.0.1获得它
<bindings>
<binding protocol="http" bindingInformation="*:58670:127.0.0.1" />
</bindings>
而是尝试在计算机上设置IIS,然后从Visual Studio部署到IIS
或者,尝试UltiDev产品:
有些人设法使用隧道,但我从未尝试过,也不知道该推荐什么
# 127.0.0.1 localhost
# ::1 localhost
<binding protocol="http" bindingInformation="*:57578:localhost" />
<binding protocol="http" bindingInformation="*:57578:*" />
<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>
<bindings>
<binding protocol="http" bindingInformation="*:58670:localhost" />
</bindings>
<bindings>
<binding protocol="http" bindingInformation="*:58670:127.0.0.1" />
</bindings>
<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>
"iisSettings": {
...
"iisExpress": {
**"applicationUrl": "https://127.0.0.1:44380",// make sure to use https**
"sslPort": 44380
}
},