net :: ERR_CONNECTION_REFUSED离子

时间:2016-05-05 23:56:53

标签: android cordova asp.net-web-api ionic-framework

我正在使用ionic开发应用程序,我可以从webApi服务器检索数据并使用ionic serve在导航器上显示它们但是当我尝试在模拟器上执行它时:ionic run android -l -c我收到此错误:net::ERR_CONNECTION_REFUSED

enter image description here

奇怪的是 $ scope 包含所需的数据,我可以记录它们。

5 个答案:

答案 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:26309http://yourMachine.yourDomain.com:26309。但是你会遇到另一个问题,你的web api正在开发网络服务器IIS Express上运行,它不允许远程连接。它可以配置为允许远程连接,但是您必须以管理员身份执行Visual Studio。更好的解决方案是安装IIS并将其配置为反向代理。这可以通过安装URL rewrite and ARRconfiguring it

在Windows 10 Pro中完成
  1. 首先安装IIS,转到控制面板,打开Windows功能或 关闭,启用Internet信息服务。
  2. here
  3. 安装网址重写2.0
  4. here
  5. 安装应用程序请求路由3.0
  6. 开放互联网信息服务经理
  7. 添加网站。设置站点名称和物理路径。在绑定部分,指定26308端口(我的个人约定:IIS Express端口 - 1)。将主机名留空。
  8. 点击新创建的网站。在右侧窗格中打开&#34; URL重写&#34;
  9. 在操作窗格中,单击&#34;添加规则&#34;,选择&#34;反向代理&#34;
  10. 在文本框中输入localhost:26309&#34;输入服务器名称或IP地址...&#34;
  11. 点击确定
  12. 将TCP端口26308的例外规则添加到Windows防火墙。
  13. 现在您需要修改cordova应用程序以向IIS上新创建的网站发出请求。它需要向http://192.168.8.162:26308http://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