Android Studio 获取请求 java.io.FileNotFoundException: http://10.0.2.2

Android Studio Get request java.io.FileNotFoundException: http://10.0.2.2

我正在开发 android 应用程序,它应该将 GCS 注册令牌发送到本地主机上 运行 的 .NET MVC 服务。我正在使用 android 仿真器 API 23 版本。我已经消除了几乎所有可能出错的东西,URL 和我现在发送的参数是硬编码的,如果我将粘贴 url 复制到浏览器中(显然用 localhost 替换 10.0.2.2)一切正常。我正在使用提琴手,但应该来自 android 的请求没有被注册。

我得到的是 InputStream inputStream = connection.getInputStream();

上的 IO 异常

1-18 18:26:28.305 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err: java.io.FileNotFoundException: http://10.0.2.2:61594/api/Account/RegisterDevice?token=2342342&coordinates=12.012;13.1515 01-18 18:26:28.305 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238) 01-18 18:26:28.305 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService.sendRegistrationToServer(RegistrationIntentService.java:108) 01-18 18:26:28.305 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:69) 01-18 18:26:28.305 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66) 01-18 18:26:28.306 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err:
at android.os.Handler.dispatchMessage(Handler.java:102) 01-18 18:26:28.306 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err: at android.os.Looper.loop(Looper.java:148) 01-18 18:26:28.306 3488-3524/gcm.play.android.samples.com.gcmquickstart W/System.err: at android.os.HandlerThread.run(HandlerThread.java:61)

在手表中 connection.getResponseCode() 状态代码是 400(错误请求)- 但服务器甚至没有被击中。

我在清单中配置了以下权限:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

发出请求的代码:

StringBuffer chaine = new StringBuffer("");
    try{
        URL url = new URL("http://10.0.2.2:61594/api/Account/RegisterDevice?token=2342342&coordinates=12.012;13.1515");
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestProperty("User-Agent", "");
        connection.setRequestMethod("GET");
        connection.setDoInput(true);
        connection.connect();

        InputStream inputStream = connection.getInputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = rd.readLine()) != null) {
            chaine.append(line);
        }

    } catch (IOException e) {
        // writing exception to log
        e.printStackTrace();
    }

来自 .NET 服务器的代码

    [AllowAnonymous]
    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public void RegisterDevice(string token, string coordinates)
    {
        if (string.IsNullOrWhiteSpace(token))
        {
            throw new ArgumentNullException("Token is empty");
        }

        var data = new Data.EmergencyService();
        if (data.AddUser(token, coordinates))
        {
            HttpContext.Current.Response.StatusCode = 200;
        }
    }

在我无法让 fiddler 注册请求之后,我完全迷失了。

为什么我不能从在浏览器中完美运行的 Andriod Studio 发出请求 GET 请求?

好的,对于那些想知道 Android 无法在 http://10.0.2.2 上访问 PC 本地主机的原因的人来说是我 运行 来自 Visual Studio 的 MVC 服务处于调试模式.

一旦我配置了本地 IIS 服务器并发布了网站(到本地文件系统),Android 就能够在 http://10.0.2.2 上访问它。

希望这能为您节省一些时间。