Share via


內容編碼

如 HTTP 通訊協定中所指定, (RFC 2616) 應用程式可以要求伺服器以編碼格式傳回 HTTP 回應。 在 Windows Server 2008 和 Windows Vista 之前,具有內容編碼的要求會傳送至應用程式,以在其層級進行處理。 從 Windows Server 2008 和 Windows Vista 開始,應用程式可以指示 WinINet 執行 gzip 和 deflate 內容編碼配置的內容解碼。

若要啟用內容解碼,應用程式會設定解碼選項,要求 WinINet 代表他們執行解碼。 不過,啟用解碼並不保證 WinINet 會執行內容解碼,而且應用程式應該準備好處理解碼。 WinINet 會在成功執行內容解碼時,從回應中移除內容編碼標頭。 無論內容編碼標頭出現在回應中時,是否啟用或停用解碼選項,應用程式都應該處理內容解碼。

啟用解碼時,應用程式必須在要求的Accept-Encoding標頭中指定支援的編碼清單。 不過,Accept-Encoding標頭不會強制服務器傳送編碼的回應。 WinINet 會將不符合可接受的編碼清單的回應傳送回應用程式。

下列清單描述啟用選項時,WinINet 將執行內容解碼的條件:

  • Accept-Encoding標頭必須存在於要求中,而且必須指定 gzip、deflate 或 gzip 和 deflate 編碼配置。
  • Content-Encoding 標頭中指定的編碼配置必須符合Accept-Encoding標頭中指定的其中一個編碼配置。
  • 回應中的 Content-Encoding 標頭只會指定一個編碼配置。
  • 回應必須只包含一個 Content- Encoding 標頭。 WinINet 會解碼只使用一個編碼配置編碼的內容。
  • Cache-Control標頭不能包含 no-transform 指示詞。
  • Content-Range 標頭不得出現在回應中。

設定解壓縮選項

您可以在會話控制碼、要求控制碼或連接控制碼上設定解碼選項。 設定解碼選項的控制碼會定義解碼選項的範圍。 例如,在會話上設定解碼,將會啟用解碼在該控制碼下建立的所有連線和要求。

若要設定解碼選項,應用程式會使用從InternetOpenInternetConnectHttpOpenRequest傳回的控制碼呼叫InternetSetOptionINTERNET_OPTION_HTTP_DECODING選項是在dwOption參數中指定,而lpBuffer參數會指向設定為 true 的布林變數。 若要停用解碼,應用程式會使用INTERNET_OPTION_HTTP_DECODING選項呼叫InternetSetOption,並將布林變數設定為 false。

設定解碼選項時,WinINet 會在應用程式呼叫 InternetReadFile時,對要求執行解碼。 如果 WinINet 在執行內容解碼時發生錯誤, 則對 InternetReadFile 的呼叫會失敗,並出現 ERROR_INTERNET_DECODING_FAILED。 解碼失敗時,應用程式有兩個選項:它可以移除Accept-Encoding標頭並重新傳送要求,也可以將要求的 [INTERNET_OPTION_HTTP_DECODING ] 選項設定為 false,然後重新傳送要求。 如果解碼選項設定為 false,應用程式必須檢查 Content-Encoding 標頭,並在應用層級執行任何解碼。

注意

WinINet 不支援伺服器實作。 此外,不應該從服務使用它。 對於伺服器實作或服務,請使用 Microsoft Windows HTTP Services (WinHTTP)