私はwebservice(C#)を呼び出すAndroid用のアプリケーションを持っており、それは非常に答えを返すのが遅いか、要求が完全に失敗する。TCP接続フェーズが失敗する(JAVAクライアントからC#サーバにWebサービスを呼び出す)
私はバックエンドコードと何か関係があると考えました。つまり、サーバーはリクエストを処理して結果を返すのに時間がかかります。私は今、処理が約40msしかかからないので、その可能性を排除しました。しかし、Webサービスコードが時々呼び出されたり、コードが実行されるのに長い時間がかかることに気付きました。
私はWiresharkを立ち上げて、転送されたパケットを見て、誤ったTCP接続フェーズとして見たものを発見しました。下の最初の図は、誤った接続を示しています。
それは次のようになります。
をしかし、それはなります。このイメージが示すようにSYN ACK
:
クライアント:SYN
サーバー:SYN ACK
クライアントこのように:
クライアント:SYN
サーバー:SYN、ACK
クライアント:ACK
私は予想通りちょうど私が正しい手順と、応答を取得するAndroidアプリ(なし再起動か何か)から再びwebservieを呼び出して、別の時間を試してみてください。ここではそれからWiresharkのイメージは以下のとおりです。
そこに答えを受ける前に長い遅延が通常であると時々(と私は、これは私が「非常に遅いWebサービス」として見るものに問題があることをかなり確信しています最初のイメージのように)、全く応答はありません。 Wiresharkはまた、Webサービスコードを実際に動かす前に、10〜20秒間、答えを「失速させる」ことができることを示しています。
これはローカルWLAN上で実行されるため、ネットワーク上の問題はありません(コンピュータはホットスポットとして動作し、他に誰も接続されていません)。 Androidデバイスは2.3.3を実行しているサムスンS2であり、Webサービスは自己ホストServiceHostを実行する.NET 3.5です。
--------ここで追加情報------------
は、(メソッドがGETである)私はJAVAコードから自分のWebサービスを呼び出す方法です:
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();
}
}
これは、Webサービスメソッドの定義方法です。NET:
[OperationContract]
[WebGet(UriTemplate = "PutMessage?jsonString={jsonString}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat= WebMessageFormat.Json)]
string PutMessage(string jsonString);
はい、伝送が失われていることは明らかです。問題はこれが頻繁に起こる可能性があり、再送が失敗し続けることです。次の試みでは、すべて正常に動作します。それはランダムに見える... – Ted