【问题标题】:Trying to access a locally-hosted ASP.net service from the Android emulator - not exposed on 127.0.0.1?尝试从 Android 模拟器访问本地托管的 ASP.net 服务 - 未在 127.0.0.1 上公开?
【发布时间】:2014-02-11 13:45:59
【问题描述】:

我正在运行通过 Visual Studio 运行的 ASP.net 服务。它可以通过浏览器访问(示例 API 调用)http://localhost:9000/api/Maps/1。当我通过浏览器访问http://127.0.0.1:9000/api/Maps/1 时,我收到 400 错误(错误请求 - 无效主机名)。

Android 模拟器可以成功调用外部站点(例如http://httpbin.org/ip)。当我指示应用程序从http://10.0.2.2:9000/api/Maps/1 提取 JSON 时(10.0.2.2 是网络告诉我将模拟器引导到主机的本地主机,结果是 HTML 用于(我假设是)来自 127.0 的相同 400 错误。 0.1 以上。

似乎当我从 Visual Studio(2013 年,如果有区别的话)运行 Web 服务时,它在 localhost 上正确公开,但不是 127.0.0.1,因此无法访问以进行测试。谁能帮我解决这个问题?谢谢!

【问题讨论】:

标签: android asp.net visual-studio rest iis


【解决方案1】:

该问题是由主机名绑定的 IIS Express 引起的,并且主机名由 Visual Studio 设置为“localhost”。因此“127.0.0.1”给出“错误 400。错误的请求(无效的主机名)”。

解决这个问题需要几个步骤。

  1. 修改applicationhost.config

这是 IIS Express 的配置文件,应该位于 ASP.NET 项目的根目录中。如果这个文件不容易找到,在任务栏中右键单击IIS express,点击“显示所有应用程序”,注册的站点应该在一个列表中。单击您尝试访问的站点。底部应列出两个文件路径,“路径”和“配置”。 config 是 applicationhost.config 文件的位置。

绑定信息将具有以下格式:

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

bindingInformation 中的冒号分隔值表示要侦听的 IP 地址、端口和主机名。您可以删除主机名以避免 IIS Express 在请求标头字段中期望“localhost”:

 <binding protocol="http" bindingInformation="*:17687:" />
  1. 退出 IIS Express

需要重新启动 IIS Express 才能进行此配置更改。它可以通过右键单击任务栏中的 IIS 并选择“退出”或通过选择特定站点来关闭(大多数情况下只有 1 个,除非有多个 Web 类型的项目 - ASP.NET、WCT 等.) 并单击“停止”,然后单击“开始”。但是完全退出它会更好,因为可能必须完成额外的配置,并且 PC 可能无论如何都需要重新启动。

  1. 防火墙

测试站点使用的端口应该包含在防火墙中。在上述情况下,端口地址为 17687。打开防火墙设置并添加入站规则以允许此 TCP 端口。此时,可能需要重新启动。至少,应该停止并重新启动项目以导致 IIS Express 重新启动。

【讨论】:

  • 可能有其他安全设置会阻止计算机接受外部连接。我发现一些病毒防护程序可能会阻止它认为危险的连接。
  • 你是一个救生员。请注意,如果您使用带有内置 IIS 的 VS,则必须以管理员权限运行它,以便它可以打开端口。我的配置文件位于 Solution\.vs\config 目录中。 .vs 目录是隐藏的,因此请确保将这些设置为可见
【解决方案2】:

Android 模拟器使用 10.0.2.2 代替 127.0.0.1。因为你开发机上的127.0.0.1对应的是模拟器自带的loopback接口。

http://developer.android.com/tools/devices/emulator.html#networkaddresses

【讨论】:

    【解决方案3】:

    您可以在 Android Emulator 中更改主机文件(也适用于有根设备)。这是你如何做到这一点的。

    1. 打开控制台或终端(windows/linux)
    2. 检查模拟器是否连接:adb devices
    3. 这样称呼:

      Linux:adb pull /system/etc/hosts /home/"yourusername"/

      Windows:adb pull /system/etc/hosts C:/hosts

    4. 打开hosts文件并在下面添加一行

      yourdomainputhere benjin.local

    5. 保存此文件并推送到模拟器
    6. adb remount
    7. adb push /home/yourusername/hosts /system/etc

    现在你可以访问这个 url,比如 benjin.local

    【讨论】:

    • 目前,hosts 文件只读取127.0.0.1 localhost。我要添加什么?据我了解,服务器只暴露给我桌面的本地主机,而不暴露给模拟器。我怀疑解决方案在于 ASP.net/IIS 配置,而不是 Android。
    • 添加你需要访问的地址10.0.2.2:9000/api/Maps/1,然后加上一些名字
    • 我可能脑子有问题,但我不确定这会有什么帮助。 hosts 文件通过将(例如)“localhost”定向到 127.0.0.1 来工作。我假设我不能在模拟器中使用“localhost”关键字,因为它指的是模拟器,而不是运行模拟器的计算机,对吧?
    • 用其他词来描述。就像我在“benjin.local”之前写的一样。所以你可以用这个访问你的网址
    • 我认为你误会了。模拟器访问 127.0.0.1:9000 就好了。问题是我的服务器暴露在 localhost 但不是 127.0.0.1。
    【解决方案4】:

    我现在无法访问标准的 ASP.NET 服务,但是在 Web API 上,您只需右键单击项目,选择属性并转到属性页的 Web 选项卡。在那里,我可以将 Project Url 字段更改为使用 127.0.0.1 而不是 localhost。完成此操作后,模拟器应该可以正常连接,而您的浏览器可以连接到 localhost127.0.0.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 2020-05-24
      • 1970-01-01
      • 2011-04-04
      • 2012-09-01
      相关资源
      最近更新 更多