Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Web-localhost:port-works,127.0.0.1:port-donds';行不通_C#_Android_Asp.net Web Api_Android Emulator_Localhost - Fatal编程技术网

C#Web-localhost:port-works,127.0.0.1:port-donds';行不通

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

我刚刚将C#WebAPI组件(WebAPI模型和控制器)添加到现有项目的
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
    的服务器上。现在,当您在浏览器中输入URL
    foo.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
        }
      },