我正在运行一个通过 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 是网络告诉我的将模拟器定向到主机的本地主机,结果是(我假设是)来自上面 127.0.0.1 的相同 400 错误的 HTML。
似乎当我从 Visual Studio(2013 年,如果这有所不同)运行 Web 服务时,它在本地主机上正确公开,但不是 127.0.0.1,因此无法访问以进行测试。谁能帮我解决这个问题?谢谢!
最佳答案
此问题是由 IIS Express 通过主机名绑定(bind)引起的,主机名由 Visual Studio 设置为“localhost”。因此“127.0.0.1”给出了“错误 400。错误的请求(无效的主机名)”。
解决这个问题需要几个步骤。
- 修改applicationhost.config
这是 IIS Express 的配置文件,应该位于 ASP.NET 项目的根目录中。如果这个文件不容易找到,右键单击任务栏中的IIS express,单击“显示所有应用程序”,注册的站点应该在列表中。单击您要访问的站点。底部应列出两个文件路径,“路径”和“配置”。配置是您的 applicationhost.config 文件的位置。
绑定(bind)信息的格式如下:
<binding protocol="http" bindingInformation="*:17687:localhost" />
bindingInformation 中冒号分隔的值表示要监听的 IP 地址、端口和主机名。您可以删除主机名以避免 IIS Express 在请求 header 字段中期望“localhost”:
<binding protocol="http" bindingInformation="*:17687:" />
- 退出 IIS Express
需要重新启动 IIS Express 才能使此配置更改生效。它可以通过右键单击任务栏中的 IIS 并选择“退出”或通过选择特定站点来关闭(大多数情况下只有 1 个,除非有多个 Web 类型项目 - ASP.NET、WCT 等.) 然后单击“停止”,然后单击“开始”。但是完全退出它会更好,因为可能需要进行额外的配置,而且 PC 可能仍然需要重新启动。
- 防火墙
测试站点使用的端口应包含在防火墙中。在上述情况下,端口地址为 17687。打开防火墙设置并添加入站规则以允许此 TCP 端口。那时,可能需要重新启动。至少,项目应该停止并重新启动以导致 IIS Express 重新启动。
关于android - 尝试从 Android 模拟器访问本地托管的 ASP.net 服务 - 未在 127.0.0.1 上公开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703617/