我有一个连接到使用Entrust有效证书的Web服务的应用程序。唯一的区别是它是一个通配符SSL。
问题是:我得到了
ERROR/NoHttpResponseException(5195): org.apache.http.NoHttpResponseException: The target server failed to respond
当我上3G时。当它在WIFI上工作时,在模拟器上工作,通过我的手机3G工作系统模拟器。但是3G手机上的应用根本不起作用。在2个不同的网络(Virgin Mobile Canada和Fido)上测试了HTC Legend CM7.0.3(2.3.3)和Nexus S 2.3.3。
我的设备上有一个显示错误的PCAP转储,但我不太了解它。
确认编号:TCP损坏。确认字段非零而ACK标志未设置
我也尝试了question此question这个问题。我不知道还能去哪里。
顺便说一下,Web服务在3G上使用浏览器。
我们也在使用带有HttpRequestInterceptor的基本身份验证。
我认为这是我能提供的所有细节。如果需要其他东西,请随意询问。
这个question也是相关的,我已经尝试了两种解决方法,但都没有。
我开始认为这可能更适合serverfault.com
这是转储file和屏幕截图
这是我用来连接相关网络服务的代码。
protected HttpEntity sendData(List<NameValuePair> pairs, String method)
throws ClientProtocolException, IOException,
AuthenticationException {
pairs.add(new BasicNameValuePair(KEY_SECURITY, KEY));
pairs.add(new BasicNameValuePair(LANG_KEY, lang));
pairs.add(new BasicNameValuePair(OS_KEY, OS));
pairs.add(new BasicNameValuePair(MODEL_KEY, model));
pairs.add(new BasicNameValuePair(CARRIER_KEY, carrier));
DefaultHttpClient client = getClient();
HttpPost post = new HttpPost();
try {
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new UrlEncodedFormEntity(pairs));
} catch (UnsupportedEncodingException e1) {
Log.e("UnsupportedEncodingException", e1.toString());
}
URI uri = URI.create(method);
post.setURI(uri);
client.addRequestInterceptor(preemptiveAuth, 0);
HttpHost target = new HttpHost(host, port, protocol);
HttpContext httpContext = new BasicHttpContext();
HttpResponse response = client.execute(target, post, httpContext);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 401) {
throw new AuthenticationException("Invalid username or password");
}
return response.getEntity();
}
答案 0 :(得分:2)
我们终于找到了问题。它与代码无关。
反向DNS是超时的。因为我没有从反向DNS收到任何答复我的apache / ssl会话过早关闭。
通过在root设备上使用Google的DNS,它可以正常工作。
现在唯一要做的就是修复我们的反向DNS。
以下是解决方法:http://code.google.com/p/android/issues/detail?id=13117#c14
在DefaultHttpClient或AndroidHttpClient实例上调用此方法。它将阻止进行反向DNS查找。
private void workAroundReverseDnsBugInHoneycombAndEarlier(HttpClient client) {
// Android had a bug where HTTPS made reverse DNS lookups (fixed in Ice Cream Sandwich)
// http://code.google.com/p/android/issues/detail?id=13117
SocketFactory socketFactory = new LayeredSocketFactory() {
SSLSocketFactory delegate = SSLSocketFactory.getSocketFactory();
@Override public Socket createSocket() throws IOException {
return delegate.createSocket();
}
@Override public Socket connectSocket(Socket sock, String host, int port,
InetAddress localAddress, int localPort, HttpParams params) throws IOException {
return delegate.connectSocket(sock, host, port, localAddress, localPort, params);
}
@Override public boolean isSecure(Socket sock) throws IllegalArgumentException {
return delegate.isSecure(sock);
}
@Override public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException {
injectHostname(socket, host);
return delegate.createSocket(socket, host, port, autoClose);
}
private void injectHostname(Socket socket, String host) {
try {
Field field = InetAddress.class.getDeclaredField("hostName");
field.setAccessible(true);
field.set(socket.getInetAddress(), host);
} catch (Exception ignored) {
}
}
};
client.getConnectionManager().getSchemeRegistry()
.register(new Scheme("https", socketFactory, 443));
}
答案 1 :(得分:1)
您是否尝试过HttpClient on Android : NoHttpResponseException through UMTS/3G中提到的解决方案?
复制到下面
我终于摆脱了这个问题:只是一个在路上被鱿鱼服务器严重处理的HTTP标头:
期待:100-Continue
默认情况下,android SDK上的DefaultHttpClient似乎存在。要解决这个问题,只需在代码中添加:
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);
答案 2 :(得分:-1)
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("year","1980"));
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://example.com/getAllPeopleBornAfter.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "n");
}
is.close();
result=sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
请参阅此代码以获取http连接