我正在使用ionic开发应用程序,我可以从webApi服务器检索数据并使用ionic serve
在导航器上显示它们但是当我尝试在模拟器上执行它时:ionic run android -l -c
我收到此错误:net::ERR_CONNECTION_REFUSED
奇怪的是 $ scope 包含所需的数据,我可以记录它们。
答案 0 :(得分:6)
Android设备/模拟器上的localhost很可能无法解析为开发计算机/服务器的IP。 Localhost可能指向设备/模拟器本身。你能不能点击机器的实际IP地址?或者您可以在云中的某个地方托管Web服务并尝试吗?
谢谢, 丹
答案 1 :(得分:1)
由于cordova app是从设备文件系统加载的,因此它的起源与web api不同。该应用尝试调用web api,但Same Origin Policy禁止此操作。要解决此问题,您需要在您的网络API上enable CORS。
要启用CORS,您需要安装Microsoft.AspNet.WebApi.Cors
NuGet包并使用EnableCors
属性。例如:
using System.Collections.Generic;
using System.Web.Http;
using System.Web.Http.Cors;
using WebApiServer.Models;
namespace WebApiServer.Controllers
{
[RoutePrefix("databases")]
[EnableCors("*", "*", "*")]
public class DatabasesController : ApiController
{
[Route("")]
[HttpGet]
public IHttpActionResult Get()
{
var databases = new List<DatabaseCategory>()
{
new DatabaseCategory
{
CategoryName = "Bases de datos relacionales",
Databases = new List<Database>()
{
new Database() { DatabaseName = "SQL Server" },
new Database() { DatabaseName = "Oracle" },
new Database { DatabaseName = "PostgreSQL" }
}
},
new DatabaseCategory
{
CategoryName = "Bases de datos NoSQL",
Databases = new List<Database>()
{
new Database() { DatabaseName = "RavenDB" },
new Database { DatabaseName = "CouchBase" },
new Database { DatabaseName = "MongoDB" }
}
}
};
return Ok(databases);
}
}
}
如果在设备上运行的应用程序(模拟或物理)调用http://localhost:26309/databases,它会尝试连接到设备上的端口26309,而不是连接到运行web api的开发人员计算机。因此,您收到ERR_CONNECTION_REFUSED
,因为设备上没有人正在侦听该端口。
因此,您应该使用您的开发者机器IP地址或解析它的DNS名称,而不是使用http://localhost:26309
。例如http://192.168.8.162:26309
或http://yourMachine.yourDomain.com:26309
。但是你会遇到另一个问题,你的web api正在开发网络服务器IIS Express上运行,它不允许远程连接。它可以配置为允许远程连接,但是您必须以管理员身份执行Visual Studio。更好的解决方案是安装IIS并将其配置为反向代理。这可以通过安装URL rewrite and ARR和configuring it:
现在您需要修改cordova应用程序以向IIS上新创建的网站发出请求。它需要向http://192.168.8.162:26308
或http://yourMachine.yourDomain.com:26308
通过这种方式,您可以同时调试您的cordova应用程序和web api应用程序,我的意思是您可以为两者添加断点。 它适用于模拟设备以及连接到USB的物理设备。您的开发机器和设备需要一个合适的wifi。
答案 2 :(得分:1)
2020更新。对我有用的东西:
ionic cordova run android --no-native-run --livereload --external
也将此添加到config.xml
<platform name="android">
<edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
...
</platform>
答案 3 :(得分:0)
由于几个原因,可能会发生此错误。
确保您尝试访问的网址有效。
然后确保在后端应用程序中启用了CORS。为此,请使用 Microsoft.AspNet.WebApi.Cors ,或者如果您使用的是OWIN,则在startup.cs配置中使用 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll) (这来自 Microsoft.Owin.Cors )
完成此操作后,请转到您的web.config并输入以下内容:
<system.webServer>
<httpProtocol>
<customHeaders>
<clear/>
<add name="Access-Control-Allow-Credentials" value="true"/>
</customHeaders>
</httpProtocol>
</system.webServer>
这将解决问题。
答案 4 :(得分:0)
在您的模拟器中(并且Ionic应用程序正在模拟器中运行),http://localhost
不再是指您的计算机,而是指被仿真的装置。理解这一点,http://localhost:26309/api/User/getAll/
在您的设计中不是有效的端点,因此请求失败。
要解决此问题,您有两种选择:
第一个选择是在Ionic应用程序中创建一个简单的代理。如下编辑您的ionic.config.json
:
{
"name": "appname",
...
"proxies": [
{
"path": "/localhost",
"proxyUrl": "http://localhost:26309"
}
]
}
现在,当从您的Ionic应用程序发出请求时,只需编写/localhost/api/User/getAll/
,它就可以正常工作。
第二个选项是将计算机的专用IP用作端点域。因此,您可以使用http://localhost:26309
http://192.168.X.Y:26309