我的Android应用程序访问(.NET)WCF服务(部署在IIS7上的单独机器上)以检索客户的数据以显示在移动设备上,但当JSon字符串数据大小增加到1000个字符时,异常处理程序捕获它错误“字符串以无效字符终止”,这应该是“}]”,但由于字符串截断,它找不到它。
令人困惑的是,它只在我从我的移动设备(即联想S960)执行应用程序时才会发生,但是从Android Studio完美运行,所以我通过调试源代码找不到任何东西。最初,我认为它可能是一个JSon大小的问题,但是当我通过浏览器(URL)从客户端机器访问相同的WCF服务时,我得到了完整的json字符串,这表明IIS正在返回完整的数据。
我的问题是:为什么只有移动设备(生产环境)无法获得超过1000个字符的JSon字符串?以下是使用WCF数据供您参考的代码。
private synchronized static boolean getRawXML(String URL,
SerializedObject responseOut,ErrMsgOut errMsgOut) {
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if (entity.getContentLength() != 0) {
Reader reader = new InputStreamReader(response.getEntity().getContent());
char[] buffer = new char[(int) response.getEntity().getContentLength()];
reader.read(buffer);
reader.close();
responseOut.setResponse(new String(buffer));
}
else {
errMsgOut.setErrorDescription("Unable to get raw data!");
return false;
}
} catch(Exception ex) {
ex.printStackTrace();
errMsgOut.setErrorDescription("getRawXML( )\n" + ex.getMessage());
return false;
}
return true;
}
答案 0 :(得分:0)
当我从客户端计算机访问同一个WCF服务直通(URL)浏览器时,我得到完整的json字符串,这表明IIS正在返回完整数据。
检查从服务器返回的内容长度标头。 IIRC,由于压缩和分块响应数据之类的事情,你真的不能指望内容长度正好是返回数据的长度。
此外,不是试图判断缓冲区大小,将输出流读入字符串并处理字符串,而只是处理输出流。查看android.util.JsonReader
以获取相关方法。它在内存使用方面也更好。