由于 cordova 应用程序是从设备文件系统加载的,因此它的来源与 Web api 不同。该应用程序尝试调用 web api,但 Same Origin Policy 禁止这样做。要克服这个问题,您需要在您的 web 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,因为设备上没有人在监听那个端口。
因此,不要使用http://localhost:26309,您应该使用您的开发人员机器 IP 地址或解析到它的 DNS 名称。例如http://192.168.8.162:26309 或http://yourMachine.yourDomain.com:26309。但是你会遇到另一个问题,你的 web api 运行在不允许远程连接的开发 web 服务器 IIS Express 上。它可以配置为允许远程连接,但是您必须以管理员身份执行 Visual Studio。更好的解决方案是安装 IIS 并将其配置为反向代理。这可以通过安装URL rewrite and ARR和configuring it在Windows 10 Pro中完成:
- 首先安装 IIS,进入控制面板,打开 Windows 功能或
关闭,启用 Internet 信息服务。
- 从here 安装 URL Rewrite 2.0
- 从here 安装应用程序请求路由 3.0
- 打开 Internet 信息服务管理器
- 添加网站。设置站点名称和物理路径。在绑定部分,指定 26308 端口(我的个人约定:IIS Express 端口 - 1)。将主机名留空。
- 单击新创建的网站。在右侧窗格中打开“URL 重写”
- 在“操作”窗格中单击“添加规则”,选择“反向代理”
- 在“输入服务器名称或IP地址...”文本框写localhost:26309
- 点击确定
- 将 TCP 端口 26308 的例外规则添加到 Windows 防火墙。
现在您需要修改您的 cordova 应用程序以向 IIS 上新创建的网站发出请求。它需要向http://192.168.8.162:26308或http://yourMachine.yourDomain.com:26308提出请求
通过这种方式,您可以同时调试您的 cordova 应用程序和 web api 应用程序,我的意思是您可以为两者添加断点。
它适用于模拟设备以及连接到 USB 的物理设备。您将需要一个可供您的开发机器和设备访问的适当 wifi。