|
|
Veröffentlicht am 24.09.2019 18:07:57
|
|
|
|

1. Hintergrund:
- Persistente Verbindungsprobleme: Bei nicht-persistenten Verbindungen kann der Browser die Grenzen der anfordernden oder antwortenden Entität dadurch definieren, ob die Verbindung ausgefallen ist oder nicht; Für kontinuierliche Verbindungen funktioniert dieser Ansatz offensichtlich nicht. Manchmal, obwohl ich alle Daten gesendet habe, weiß der Browser nicht, ob neue Daten über die offene Verbindung eingehen, also wartet er einfach.
- Lösen Sie mit Inhaltslänge: Berechnen Sie die Entitätslänge und informieren Sie die andere Partei über den Kopf. Der Browser kann anhand der Längeninformationen der Content-Length erkennen, dass die Antwort-Entität über ist.
- Neues Problem mit der Inhaltslänge: Da das Feld Inhaltslänge wirklich die Entitätslänge widerspiegeln muss, ist die Länge für dynamisch generierte Inhalte unbekannt, bis der Inhalt erstellt ist. Um die Länge genau zu bestimmen, kann man derzeit nur einen ausreichend großen Puffer öffnen und warten, bis alle Inhalte generiert sind, bevor man berechnet. Dies erfordert jedoch einerseits mehr Speicheraufwand, andererseits lässt es den Client länger warten.
- Wir brauchen einen neuen Mechanismus, der nicht auf die Länge des Headers angewiesen ist und die Grenzen der Entitäten kennt – Transfer-Encoding: chunked.
2. Transfer-Codierung (gehackt)
- Transfer-Encoding ist ein HTTP-Headerfeld (Response Header-Feld), was wörtlich "Übertragungskodierung" bedeutet. Die neueste HTTP-Spezifikation definiert nur eine Art des Codierungstransports: chunked.
- Die Chunked-Transfercodierung ist ein Datenübertragungsmechanismus im Hypertext Transfer Protocol (HTTP), der es ermöglicht, HTTP-Daten, die von einem Webserver an den Client gesendet werden, in mehrere Teile aufzuteilen. Blocktransportcodierung ist nur in HTTP-Protokollversion 1.1 (HTTP/1.1) verfügbar.
- Die Daten werden in eine Reihe von Chunks zerlegt und in einem oder mehreren Chunks gesendet, sodass der Server Daten senden kann, ohne die Gesamtgröße des gesendeten Inhalts im Voraus zu kennen.
Spezifische Methoden
- Nach dem Hinzufügen von Transfer-Encoding: chunked zum Header bedeutet das, dass das Paket chunked ist. In diesem Fall müssen die Entitäten im Paket stattdessen in einer Reihe von Chunks übertragen werden.
- Jeder Chunk enthält den hexadezimalen Längenwert und die Daten, und der Längenwert ist exklusiv für eine Zeile; die Länge enthält weder das CRLF am Ende noch das CRLF am Ende der Chunk-Daten.
- Der letzte Chunk-Längenwert muss 0 sein, und die entsprechenden Chunk-Daten enthalten keinen Inhalt, was das Ende der Entität anzeigt.
asp.net Kerntestcode:
|
Vorhergehend:Inhaltslänge des HTTP-ProtokollsNächster:Drei Faktoren, die mich dazu bringen, Chrome abzulehnen
|