Als HTTP 1.1-Server, antworte ich auf eine GET-Anforderung mit Statuscode 200 OK, dann starten Sie die Daten an den Client gesendet. Während dieses Sendevorgangs tritt ein Fehler auf und ich kann den Vorgang nicht beenden.HTTP: Fehler bei der Antwort nach Statuscode 200 OK
Ich kann keine neuen Statuscode als Endstatus Code bereits gesendet wurde.
Wie verhalte ich mich, der Kunden wissen zu lassen, ist ein Fehler aufgetreten, und ich kann nicht mit dieser HTTP-Anforderung weitergehen?
ich nur eine Lösung vorstellen kann: die Steckdose in der Nähe, aber es ist nicht perfekt: Es bricht die Keep-Alive-Funktion und keine eindeutige Erklärung des Fehlers an den Client gegeben wird.
Der HTTP-Standard scheint anzunehmen, dass der Server bereits weiß genau, was zu antworten, bevor er antworten beginnt. Aber das ist nicht immer der Fall. Beispiele: Ich gebe eine sehr große Datei (mehrere GB) von der Festplatte zurück, und ich bekomme einen IO-Fehler während des Lesens der Datei. Gleiches Beispiel mit einem großen DB-Dump.
Ich kann nicht meine ganze Antwort im Speicher konstruieren dann senden Sie es.
Der HTTP 1.1-Standard hilft für eine solche Verwendung mit der chunked Transfer-Codierung: Ich muss nicht einmal die endgültige Größe wissen, bevor Sie mit dem Senden der Antwort beginnen. Diese Verwendung ist also nicht von HTTP 1.1 ausgeschlossen.
Es gibt einen Content-Length-Header, Kunde sollte wissen, welche Menge an Daten, die sie angeblich zu empfangen. Ich kann mir keinen anderen Weg vorstellen, aber ich gebe zu, dass ich nie überprüft habe, ob etwas passiert, nachdem die Datei übertragen wurde, kein "End-of-Transmission" -Head-Header, den ich gewusst hätte. Ich würde wetten Server ist egal egal, es ist HTTP-Client-Geschäft zu überprüfen, schließlich ist es der Client, der ursprünglich Ressource angefordert. –
_know_ Sie haben den Inhalt vor dem Senden von '200'. Ja, die Pufferung verbraucht mehr Ressourcen (hauptsächlich Speicher), behebt jedoch diese Art von Dingen. Und mehrere 'GB's schreit zu mir' http' kann ein ungeeigneter Transport sein .... – Wrikken
@Piotr Wadas: Der Inhaltslängen-Header kann nicht zurückgegeben werden, wenn wir die Antwortgröße nicht im Voraus wissen. Chunked Transfer Encoding existiert für diesen speziellen Zweck, scheint aber keine Möglichkeit zu bieten zu sagen "es gibt jetzt einen Fehler". – user1409932