2012-03-04 6 views
0

私はwebservice(C#)を呼び出すAndroid用のアプリケーションを持っており、それは非常に答えを返すのが遅いか、要求が完全に失敗する。TCP接続フェーズが失敗する(JAVAクライアントからC#サーバにWebサービスを呼び出す)

私はバックエンドコードと何か関係があると考えました。つまり、サーバーはリクエストを処理して結果を返すのに時間がかかります。私は今、処理が約40msしかかからないので、その可能性を排除しました。しかし、Webサービスコードが時々呼び出されたり、コードが実行されるのに長い時間がかかることに気付きました。

私はWiresharkを立ち上げて、転送されたパケットを見て、誤ったTCP接続フェーズとして見たものを発見しました。下の最初の図は、誤った接続を示しています。

それは次のようになります。

enter image description here

をしかし、それはなります。このイメージが示すようにSYN ACK


クライアント:SYN
サーバー:SYN ACK
クライアントこのように:
クライアント:SYN
サーバー:SYN、ACK
クライアント:ACK

私は予想通りちょうど私が正しい手順と、応答を取得するAndroidアプリ(なし再起動か何か)から再びwebservieを呼び出して、別の時間を試してみてください。ここではそれからWiresharkのイメージは以下のとおりです。 enter image description here

そこに答えを受ける前に長い遅延が通常であると時々(と私は、これは私が「非常に遅い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); 

答えて

1

あなたがもう少し近くダンプを見れば、何を実際に見ていると、サーバーからすべてのパケットを取得していないクライアントです。

Client: SYN 
Server: SYN ACK (ACK, never reaches the client) 
Server: SYN ACK (Retransmission of the first ACK, also lost.) 
Client: SYN (Retransmission, it does not know the server received the first SYN) 
Server: SYN ACK (ACK on the SYN from the client, once again lost) 
Client: SYN (Retransmission since it *still* does not know the server got the SYN) 

つまり、クライアントがサーバパケットを受信しなければ、両側からの完全な正常な再送信。

+0

はい、伝送が失われていることは明らかです。問題はこれが頻繁に起こる可能性があり、再送が失敗し続けることです。次の試みでは、すべて正常に動作します。それはランダムに見える... – Ted

関連する問題