所以我有一个Android应用程序调用Web服务(C#),我从一开始就注意到它经常发生,但并非总是这样,它在返回答案时非常缓慢,或者请求完全失败。
起初我认为它与后端代码有关,即服务器需要很长时间来处理请求并返回结果。我现在排除了这种可能性,因为处理过程只需要大约40毫秒。然而,我注意到web服务代码有时不被调用,或者需要很长时间来执行代码。
于是我启动了Wireshark并查看了传输的数据包,并发现了我认为TCP连接错误的一个阶段。下面的第一张图片显示了错误的连接。
它看起来像这样:
客户端:SYN
服务器:SYN ACK
客户端:SYN ACK
如图所示:
但它应该是这样的:
客户端:SYN
服务器:SYN,ACK
客户:ACK
当我再次尝试时,只需从Android应用程序再次调用webservie(无需重新启动或任何操作),我就可以得到正确的步骤,并按照预期做出响应。这里是一个Wireshark图像:
我很确定这是我看到的“非常慢的web服务”的问题,因为在接收答案之前通常会有很长的延迟,有时(如在第一张图片中),根本没有响应。 Wireshark还表明,它可以“停止”10-20秒的答案,并且在实际重新使用Web服务代码之前。
没有网络问题,因为它全部在本地WLAN上运行(计算机作为热点,没有其他人连接到它)。 Android设备是运行2.3.3的Samsung S2,Web服务是运行自托管ServiceHost的.NET 3.5。
有任何想法吗?
- - - - 附加信息 - - - - - -
这里是我如何从JAVA代码调用我的web服务(方法是GET):
private void executeRequest(HttpUriRequest request, String url)
{
HttpClient client = new DefaultHttpClient();
try
{
httpResponse = client.execute(request);
responseCode = httpResponse.getStatusLine().getStatusCode();
message = httpResponse.getStatusLine().getReasonPhrase();
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
response = convertStreamToString(instream);
// Closing the input stream will trigger connection release
instream.close();
}
} catch (ClientProtocolException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
} catch (IOException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
}
}这是如何在.NET中定义Web服务方法:
[OperationContract]
[WebGet(UriTemplate = "PutMessage?jsonString={jsonString}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat= WebMessageFormat.Json)]
string PutMessage(string jsonString);