从Android使用简单的WCF

时间:2016-02-08 10:07:22

标签: java android .net wcf

我正在编写一个简单的应用程序,需要通过MySQL数据库验证登录详细信息。我特意不能使用PHP,所以我选择了WCF服务模型。现在,我让WCF通过我的浏览器工作。所有get方法都在我的浏览器中工作并返回所需的JSON输出,但为了良好的顺序,我将发布服务接口;

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getUserAuthenticated/{value1}/{value2}")]
    bool GetUserAuthenticated(string value1, string value2);

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getIsUserModel/{value}")]
    bool GetIsUserModel(string value);

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getIsUserActive/{value}")]
    bool GetIsUserActive(string value);

如上所述,这是有效的。但是当我尝试从我的应用程序中使用服务时;

    public void UserAuthenticated(String email, String password) {
        try {
            URL url = new URL("http://10.0.0.180:15021/Service1.svc/GetUserAuthenticated/" + email + "/" + password);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");

            Log.d("Response Code: ", "" + httpURLConnection.getResponseCode());
            InputStream in = new BufferedInputStream(httpURLConnection.getInputStream());
            String response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");
            Log.d("Response String: ", response);

        } catch (MalformedURLException mue) {
            mue.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

我收到了java.io.FileNotFoundException。

02-08 04:44:53.015 7425-7457/com.testapp W/System.err: java.io.FileNotFoundException: http://10.0.0.180:15021/Service1.svc/GetUserAuthenticated/user/pass
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:186)
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at com.testapp.LoginClass.UserAuthenticated(LoginClass.java:29)
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at com.test.WelcomeScreen$LoginAuthenticator.doInBackground(WelcomeScreen.java:103)
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at com.testapp.WelcomeScreen$LoginAuthenticator.doInBackground(WelcomeScreen.java:90)
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-08 04:44:53.015 7425-7457/com.testapp W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
02-08 04:44:53.019 7425-7457/com.testapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-08 04:44:53.019 7425-7457/com.testapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-08 04:44:53.019 7425-7457/com.testapp W/System.err:     at java.lang.Thread.run(Thread.java:841)
02-08 04:44:53.023 7425-7425/com.testapp W/EGL_genymotion: eglSurfaceAttrib not implemented
02-08 04:44:53.155 577-912/system_process W/InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@529adc88 attribute=null, token = android.os.BinderProxy@52b37f04

有人可以指点我这里正确的方向吗?我能够找到的所有示例都使用已弃用的HttpClient来处理WCF消耗,我不认为使用drepecated类来处理它是一种好习惯。

我有点迷失在这里,所以任何帮助都会受到很大关注!

编辑: 谷歌搜索了一下,让HttpURLConnection打印出它得到的响应代码。我从服务中得到400 BAD REQUEST。

EDIT2:

我创建了一个Azure站点来运行我的服务,暂时解决了我的问题。但是,我仍然对在本地主机上运行它时无法连接到服务的原因感兴趣。

1 个答案:

答案 0 :(得分:0)

所以我解决了。我做的是;

  1. 我在Windows防火墙中打开了我尝试连接的端口。在我的情况下8008.我打开了它用于传出和进入的流量。
  2. 我安装了IIS Express,并在我的工作站所拥有的IP上设置了本地页面。
  3. 经过很多关于interwebz的破坏,在Stack Overflow上,我发现其他人通过Genymotion连接到本地IIS地址时遇到问题,甚至使用localhost的标准IP 10.0.3.2。从SO的另一个帖子我找到了这个指南;
  4. https://developer.chrome.com/devtools/docs/remote-debugging

    原来,我不得不移植设备。而现在它正在发挥作用。我现在可以通过我的工作站IP端口8008上的Genymotion模拟器连接到我的WCF服务。

    我希望这有助于某人。

    干杯。