doppelte Anfragen von HttpClient

8

Ich benutze HttpClient 4.0.1 auf Android ... Ich mache eine POST-Anfrage mit einem Header-Satz, der die aktuelle Millis ist ... Ich sehe, dass die Anfrage den Server zweimal innerhalb von wenigen Millis (5-10) traf einander .. aber der Header, den ich gesetzt habe, ist für beide Anfragen gleich. Das passiert sehr sporadisch ... Ich sehe keinen wirklichen Unterschied zwischen den Anfragen in Wireshark ... Ich habe nur keine Ahnung, wie das passieren könnte. Wer ist schon mal darauf gestoßen oder hat Tipps, wie man es weiter debuggen kann?

Hier ist der Code, den ich benutze, um den Client zu erstellen:

%Vor%     
danb 21.01.2012, 00:06
quelle

3 Antworten

18

Es scheint also so zu sein, dass Ihr Client eine Anfrage sendet, nicht rechtzeitig antwortet und als Folge die gleiche Anfrage wiederholt (wie es sein sollte). Dies führt wiederum dazu, dass mehrere POST -Anfragen (nahezu nacheinander) an Ihren Server gesendet werden, mit denen Ihr Server derzeit nicht angemessen umgehen kann.

Um dies zu überprüfen / zu debuggen, versuchen Sie, HTTP-Wiederholungen wie folgt zu deaktivieren:

%Vor%

Dies wird sich natürlich um Ihr doppeltes Anfragenproblem kümmern, führt dann aber zu einem noch ernsteren Problem; Nämlich, es wird einmal (und nur einmal) versuchen und scheitern. Aus den Informationen, die ich von Ihren Kommentaren erhalten habe, hier ein paar Ideen, die Sie ausprobieren können:

Bitte enthüllen Sie den Pseudocode, da ich nicht alle Einzelheiten darüber habe, wie Ihr Client aufgebaut ist

Behandle mehrere POSTS in Folge

  • Deaktivieren Sie automatische Wiederholungen (wie oben)
  • Wickeln Sie Ihre POST -Anfragen in eine Schleife ähnlich wie das ist implementiert
  • Dann entweder sleep zwischen Ihren manuellen Versuchen oder implementieren Sie Ihre Version von Exponential Backoff

Egal was, Ihr Server wird die Fähigkeit haben, doppelte Anfragen auf vernünftige Weise zu behandeln, das ist HTTP nach allem. Sie geben ihm jedoch zumindest die Chance, die erste zu verarbeiten, bevor sie mit Duplikaten bombardiert wird.

Ich empfehle, dass der erste Schritt bei der Verarbeitung einer Anfrage darin besteht, eine Form eines (doppelten) Flags festzulegen. Dann, wenn / wenn es einen Duplikat erhält, verarbeitet es (wie üblich) die erste Anfrage und ignoriert die Duplikate stillschweigend.

Um nur zusammenzufassen, der Sinn dieses ganzen Schemas war Ihrem Server eine Chance zu geben, das Dupe-Flag zu setzen . Danach ist es die Aufgabe Ihres Servers, doppelte Anforderungen nach Bedarf zu verwerfen (oder zu behandeln). Macht das alles Sinn?

    
Marvin Pinto 24.01.2012, 16:14
quelle
1

Ich kann nicht für die mit Android ausgelieferte HttpClient-Version sprechen, da es sich tatsächlich um eine Gabel handelt, die auf einem extrem alten Pre-BETA-Snapshot basiert. Wenn Sie jedoch eine Bestandsversion von Apache HttpClient 4.x verwenden, versucht NICHT POST- oder PUT-Anforderungen automatisch erneut zu senden, sofern nicht anders konfiguriert.

In Ihrem speziellen Fall vermute ich, dass die HTTP-Nachricht aufgrund eines Verbindungsverlusts oder eines ähnlichen Netzwerkproblems vom WLAN-Treiber erneut übertragen wird. HTTP ist kein garantiertes Übermittlungsprotokoll. HTTP-Nachrichten können durch Transporte auf niedrigeren Ebenen erneut gesendet werden. Ihre Anwendung muss bereit sein, mit doppelten HTTP-Nachrichten umzugehen.

    
oleg 24.01.2012 13:34
quelle
0

Retry PolicyWir können angepasst werden

MIT VOLLEY REQUEST

  

stringRequest.setRetryPolicy (neue DefaultRetryPolicy (                   0,                   DefaultRetryPolicy.DEFAULT_MAX_RETRIES,                   DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));     volleySingleton.addToRequestQueue (stringRequest);

    
Akash 21.07.2017 08:41
quelle

Tags und Links