Share via


Inhaltscodierung

Wie im HTTP-Protokoll (RFC 2616) angegeben, können Anwendungen anfordern, dass der Server HTTP-Antworten im codierten Format zurückgibt. Vor Windows Server 2008 und Windows Vista wurden Anforderungen mit Inhaltscodierung zur Verarbeitung auf ihrer Ebene an die Anwendung gesendet. Ab Windows Server 2008 und Windows Vista kann die Anwendung WinINet anweisen, die Inhaltsdecodierung für gzip durchzuführen und Inhaltscodierungsschemas zu entschärfen.

Um die Inhaltsdecodierung zu aktivieren, legt die Anwendung die Decodierungsoption fest, die anfordert, dass WinINet die Decodierung in ihrem Namen ausführt. Das Aktivieren der Decodierung garantiert jedoch nicht, dass WinINet die Inhaltsdecodierung ausführt, und die Anwendung sollte auf die Decodierung vorbereitet sein. WinINet entfernt den Inhaltscodierungsheader aus der Antwort, wenn die Inhaltsdecodierung erfolgreich ausgeführt wird. Von Anwendungen wird erwartet, dass sie die Inhaltsdecodierung behandeln, unabhängig davon, ob die Decodierungsoption aktiviert oder deaktiviert ist, wenn der Inhaltscodierungsheader in der Antwort vorhanden ist.

Wenn die Decodierung aktiviert ist, muss die Anwendung die Liste der unterstützten Codierungen im Accept-Encoding-Header der Anforderung angeben. Der Accept-Encoding-Header verpflichtet den Server jedoch nicht, eine codierte Antwort zu senden. WinINet sendet Antworten, die nicht mit der Liste der zulässigen Codierungen übereinstimmen, an die Anwendung zurück.

In der folgenden Liste werden die Bedingungen beschrieben, unter denen WinINet die Inhaltsdecodierung ausführt, wenn die Option aktiviert ist:

  • Der Accept-Encoding-Header muss in der Anforderung vorhanden sein, und er muss die Codierungsschemas gzip, deflate oder gzip und deflate angeben.
  • Das im Content-Encoding-Header angegebene Codierungsschema muss mit einem der im Accept-Encoding-Header angegebenen Codierungsschemas übereinstimmen.
  • Der Content-Encoding-Header in der Antwort gibt nur ein Codierungsschema an.
  • Die Antwort darf nur einen Content-Encoding-Header enthalten. WinINet decodiert Inhalte, die nur mit einem Codierungsschema codiert sind.
  • Der Cache-Control-Header darf die No-transform-Direktive nicht enthalten.
  • Der Content-Range-Header darf in der Antwort nicht vorhanden sein.

Festlegen der Dekomprimierungsoption

Die Decodierungsoption kann für das Sitzungshandle, das Anforderungshandle oder das Verbindungshandle festgelegt werden. Das Handle, für das die Decodierungsoption festgelegt ist, definiert den Bereich der Decodierungsoption. Beispielsweise ermöglicht das Festlegen der Decodierung für die Sitzung die Decodierung aller Verbindungen und Anforderungen, die unter diesem Handle erstellt wurden.

Um die Decodierungsoption festzulegen, ruft die Anwendung InternetSetOption mit dem von InternetOpen, InternetConnect oder HttpOpenRequest zurückgegebenen Handle auf. Die option INTERNET_OPTION_HTTP_DECODING wird im dwOption-Parameter angegeben, und der lpBuffer-Parameter verweist auf eine boolesche Variable, die auf true festgelegt ist. Um die Decodierung zu deaktivieren, ruft die Anwendung InternetSetOption auf, wobei die Option INTERNET_OPTION_HTTP_DECODING und die boolesche Variable auf false festgelegt ist.

Wenn die Decodierungsoption festgelegt ist, führt WinINet die Decodierung für die Anforderung durch, wenn die Anwendung InternetReadFile aufruft. Wenn WinINet bei der Inhaltsdecodierung auf einen Fehler stößt, schlägt der Aufruf von InternetReadFile mit einem ERROR_INTERNET_DECODING_FAILED fehl. Wenn die Decodierung fehlschlägt, hat die Anwendung zwei Optionen: Sie kann den Accept-Encoding-Header entfernen und die Anforderung erneut senden, oder sie kann die Option INTERNET_OPTION_HTTP_DECODING für die Anforderung auf false festlegen und die Anforderung dann erneut senden. Wenn die Decodierungsoption auf false festgelegt ist, muss die Anwendung den Content-Encoding-Header überprüfen und jede Decodierung auf Anwendungsebene durchführen.

Hinweis

WinINet unterstützt keine Serverimplementierungen. Darüber hinaus sollte es nicht von einem Dienst verwendet werden. Verwenden Sie für Serverimplementierungen oder Dienste Microsoft Windows HTTP Services (WinHTTP).