Ich habe angefangen, ASIHTTPRequest in meinem iOS-Projekt zu verwenden, um REST-Server-Methodenaufrufe auszuführen, und war bisher sehr erfolgreich damit. Ich habe nur ein seltsames intermittierendes Problem. Sehr selten bekomme ich die folgende Antwort von [ASIHTTPRequest startAsynchronous]:
HTTP / 0,9 200 OK
Wenn dies passiert, wird meine Servermethode nicht aufgerufen. Normalerweise kommt jeder Methodenaufruf mit einer Antwort zurück, die 'HTTP / 1.1' startet. Ich verwende HTTPS mit einem GeoTrust / RapidSSL-Zertifikat, um die Verbindung zu sichern. Interessanterweise habe ich die gleiche 'HTTP / 0.9 200 OK' Antwort erhalten, wenn ich versuche, eine Verbindung zum SSL-Port (443) herzustellen, aber 'http' als Protokoll anzugeben.
Nur um weitere Informationen hinzuzufügen - das Problem tritt meistens auf, nachdem die App für eine gewisse Zeit nicht benutzt wurde. Z.B. Die Anfrage wird erfolgreich abgeschlossen. Lassen Sie die App für einige Zeit inaktiv. Bei der nächsten Anfrage tritt das Problem auf und die App funktioniert weiterhin einwandfrei.
Kann jemand etwas Licht auf das werfen, was möglicherweise vorkommt?
Vielen Dank, Jonathan
UPDATE: Ich habe einige Debug-Informationen von ASIHTTPRequest eingefügt, als das Problem auftrat:
%Vor%In diesem Fall sind die IOS-Besonderheiten nicht bekannt, aber HTTP 0.9 wird komplett aufgegeben. Es gibt einen klaren Grund dafür - es unterstützt keinen "Host:" - Header. Dies bedeutet, dass einzelne IP-Adressen keine virtuellen Hosts haben können. Solche Dinge wurden Ende der 90er Jahre obsolet.
Eine solche Reaktion sollte niemals im wirklichen Leben passieren. Wenn es immer noch passiert, hat ein Client eine Anfrage wie "GET / HTTP / 0.9" gestellt. Aber diese Kunden sind vor 15 Jahren verschwunden.
SSL ist etwas, das HTTP nicht sehr bewusst ist. Also ich glaube das ist nicht verwandt. SSL-Tunnel wird eingerichtet und danach wird einfaches HTTP ausgeführt.
Als Schlussfolgerung würde ich sagen, dass Sie oder jemand möglicherweise eine obsolete Methode ausgelöst haben. Und IOS haben vielleicht einfach keine Ahnung, was damit zu tun ist. Möglicherweise ist die IOS-Methode auf Methoden mit Hostnamen beschränkt und wird daher nicht ausgelöst. Trotzdem solltest du dir keine Sorgen machen, wenn der Client wirklich 0.9 spricht, weil er von den meisten Seiten keine richtigen Antworten erhält. Wenn der Client 1.1 spricht und Sie 0.9 antworten, dann wird möglicherweise die Anfrage irgendwie missverstanden und der Fallback-Mechanismus auf die niedrigst mögliche HTTP-Version tritt auf. Vielleicht haben Sie vergessen, den Host-Namen für die Anfrage einzurichten oder einen Syntaxfehler darin zu machen?
Es gibt einige Erwähnungen zu diesem Problem im Web, und im Grunde bezieht es sich auf persistente Verbindungen, und wenn etwas falsch mit einem Content-length-Header und einem Inhalt selbst, der von einigen Buggy-Servern zurückgegeben wird. Es könnte die Browser und das iOS-Framework vermasseln, und sie bemerken die Header nicht wirklich.
Hier ist die eine der möglichen Erklärungen .
Versuchen Sie, persistente Verbindungen zu deaktivieren, es sollte helfen. Dieser Rat kam von den Entwicklern von ASIHTTPRequest (ziemlich ähnliche Situation).
%Vor% HTTP/0.9 200 OK
ist ein nicht existierender Nachrichtenkopf. HTTP / 0.9 ist definiert als die Anfrage: GET <Request-URI> HTTP/0.9 <CRLF>
, die Antwort ist [Entity-Body]
, ohne Statuszeilen und Header. (& lt; urn: ietf: rfc: 1945 & gt;)
Irgendwo ist ein Fehler in Ihrer Software. Ich schätze, die Anfrage ist entweder fehlgeschlagen oder wurde noch nicht empfangen.
Tags und Links objective-c ios https rest asihttprequest