WinHTTP 5.1 的新功能

本主題描述 WinHTTP 5.1 版與 5.0 版之間最重要的差異。 許多差異都需要從 5.0 版移轉至 5.1 版的應用程式進行程式碼變更。 5.1 版的某些功能僅適用于 Windows Server 2003 和 Service Pack 2 (SP2) 的 Windows XP,特別是針對惡意網頁伺服器改善用戶端安全性的相關功能。

重要

WinHTTP 5.1 版已不再提供 WinHTTP 5.0 下載。 自 2004 年 10 月 1 日起,Microsoft 已從 MSDN 移除 WinHTTP 5.0 SDK 下載,並終止 5.0 版的產品支援。

 

DLL 名稱變更

新的 WinHTTP 5.1 DLL 名稱是Winhttp.dll,而 WinHTTP 5.0 DLL 的名稱則是Winhttp5.dll。

WinHTTP 5.0 和 5.1 可以共存于相同的系統上;WinHTTP 5.1 不會取代或透過 WinHTTP 5.0 安裝。

可轉散發

WinHTTP 5.1 僅適用于 Windows Server 2003、Windows 2000 Professional with Service Pack 3 (SP3) 、Windows XP with Service Pack 1 (SP1) 和更新版本的作業系統。 WinHTTP 5.1 無法使用可轉散發合併模組 (.msm) 檔案。

WinHttpRequest ProgID

WinHttpRequest 元件的 ProgID 已從 「WinHttp.WinHttpRequest.5」 變更為 「WinHttp.WinHttpRequest.5.1」。 WinHttpRequest類別的 CLSID 也已變更。

非同步回呼行為變更

在非同步模式中呼叫 WinHttpWriteDataWinHttpQueryDataAvailableWinHttpReadData 函式時,請勿依賴要設定的個別 lpdwNumberOfBytesWrittenlpdwNumberOfBytesAvailablelpdwNumberOfBytesRead OUT 參數。 如果函式呼叫以非同步方式完成,WinHTTP 不會寫入應用程式程式碼所提供的這些指標。 相反地,應用程式應該使用 lpvStatusInformationdwStatusInformationLength 參數來擷取這些值給回呼函式。

預設設定的變更

預設設定的變更包括:

  • WinHTTP 5.1 中預設會啟用 SSL 伺服器憑證驗證。 WinHTTP 5.0 不會處理驗證伺服器憑證為嚴重錯誤時遇到的失敗;系統會使用 SECURE_FAILURE回 呼通知向應用程式回報,但不會中止要求。 WinHTTP 5.1 或者,將伺服器憑證驗證失敗當做中止要求的嚴重錯誤來處理。 應用程式可以使用 [WINHTTP_OPTION_SECURITY_FLAGS ] 選項,指示 WinHTTP 忽略一小部分的憑證錯誤,例如未知的 CA、無效/過期的憑證日期或不正確憑證主體名稱。
  • WinHTTP 5.1 中預設會停用 Passport 驗證支援。 可以使用 WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH 選項來啟用 Passport 支援。 預設也會停用 Keyring 中的自動 Passport 認證查閱。
  • 重新導向行為變更:基於安全性考慮,HTTP 會從安全 HTTPs: URL 重新導向至一般 HTTP: URL 預設不會再自動追蹤。 有新的選項 WINHTTP_OPTION_REDIRECT_POLICY,可覆寫 WinHTTP 5.1 中的預設重新導向行為。 使用 WinHttpRequest COM 元件時,請使用新的 WinHttpRequestOption_EnableHttpsToHttpRedirects 選項,以啟用從 HTTPs: 重新導向至 HTTP: URL。
  • 建立 WinHTTP 追蹤檔案時,存取權會受限於 ACL,讓只有系統管理員可以讀取或寫入檔案。 建立 tracefile 的使用者帳戶也可以修改 ACL 以授與其他人存取權。 此保護僅適用于支援安全性的檔案系統;也就是 NTFS,而非 FAT32) 。
  • 從 Windows Server 2003 和 Windows XP SP2 開始, 基於安全性考慮,將要求傳送至下列已知的非 HTTP 埠受到限制:21 (FTP) 、25 (SMTP) 、70 (GOPHER) 、110 (POP3) 、119 (NNTP) 、143 (IMAP) 。
  • 從 Windows Server 2003 和 SP2 的 Windows XP 開始,HTTP 回應中 WinHTTP 接受的最大標頭資料量預設為 64K。 如果伺服器 HTTP 回應包含超過 64K 的總標頭資料,WinHTTP 會因為 ERROR_WINHTTP_INVALID_SERVER_RESPONSE 錯誤而失敗要求。 您可以使用新的 WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE 選項覆寫此 64K 限制。

IPv6 支援

WinHTTP 5.1 新增對網際網路通訊協定第 6 版 (IPv6) 的支援。 WinHTTP 可以將 HTTP 要求傳送至 DNS 名稱解析為 IPv6 位址的伺服器,並從 Windows Server 2003 和 Windows XP SP2 開始,WinHTTP 也支援 IPv6 常值位址。

適用于 WinHTTP 的 C/C++ API 中的新選項

WinHTTP 5.1 會實作下列新選項:

「\#define WINHTTP\_OPTION\_PASSPORT\_SIGN\_OUT 86」 「\#define WINHTTP\_OPTION\_PASSPORT\_RETURN\_URL 87」 「\#define WINHTTP\_OPTION\_REDIRECT\_POLICY 88」

從 Windows Server 2003 和 Windows XP SP2 開始,WinHTTP 5.1 會實作下列新選項。 不過,在具有 SP3 的 Windows 2000 Professional 或具有 SP1 的 Windows XP 上,呼叫 WinHttpSetOptionWinHttpQueryOption 時,這些選項識別碼會失敗:

「\#define WINHTTP\_OPTION\_RECEIVE\_RESPONSE\_TIMEOUT 7」 「\#define WINHTTP\_OPTION\_MAX\_HTTP\_AUTOMATIC\_REDIRECTS 89」 「\#define WINHTTP\_OPTION\_MAX\_HTTP\_MAX\_HTTP\ _STATUS\_CONTINUE 90」 「\#define WINHTTP\_OPTION\_MAX\_RESPONSE\_HEADER\_SIZE 91」 「\#define WINHTTP\_OPTION\_MAX\_RESPONSE\_DRAIN\_SIZE 92」

WinHttpRequest 5.1 元件中的新選項

WinHttpRequest 5.1 元件會實作下列新選項:

「WinHttpRequestOption\_RevertImpersonationOverSsl」 「WinHttpRequestOption\_EnableHttpsToHttpRedirects」 「WinHttpRequestOption\_EnablePassportAuthentication」

下列新的 WinHttpRequest 5.1 選項可從 Windows Server 2003 和 Windows XP sp2 開始提供:

「WinHttpRequestOption\_MaxAutomaticRedirects」 「WinHttpRequestOption\_MaxResponseHeaderSize」 「WinHttpRequestOption\_MaxResponseDrainSize」 「WinHttpRequestOptions\_EnableHttp1\_1」

當自動登入安全性設定為高時,Proxy 不受信任

在 WinHTTP 5.0 中,Proxy 伺服器一律會受到自動登入的信任。 當設定 [WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH 原則] 選項時,這不再適用于在 Windows Server 2003 和 Windows XP 上執行的 WinHTTP 5.1。

Web Proxy 自動探索 (AutoProxy) API

為了簡化 WinHTTP 型應用程式的 Proxy 設定,WinHTTP 現在會實作 Web Proxy 自動探索 (WPAD) 通訊協定,也稱為 autoproxy。 這是網頁瀏覽器實作的相同通訊協定,例如 Internet Explorer,可自動探索 Proxy 組態,而不需要使用者手動指定 Proxy 伺服器。 為了支援 autoproxy,WinHTTP 5.1 會實作新的 C/C++ 函式 WinHttpGetProxyForUrl,再加上兩個支援函式 :WinHttpDetectAutoProxyConfigUrlWinHttpGetIEProxyConfigForCurrentUser

已知問題

下列問題已知存在於 Windows 2000 Professional 上的 WinHTTP 5.1 搭配 SP3 和 Windows XP SP1。 從 Windows Server 2003 和 Windows XP SP2 開始,WinHTTP 會解決這些問題:

  • 如果應用程式在WinHttpRequest元件上使用WinHttpSetTimeouts函式或SetTimeouts方法來設定非無限 DNS 解析逾時,例如dwResolveTimeout參數,則每次 WinHTTP 解析 DNS 名稱時都會發生執行緒控制碼流失。 透過大量的 HTTP 要求,這會導致大量的記憶體流失。 因應措施是將預設無限解析逾時設定維持不變, (值為 0 指定無限逾時) 。 在任何情況下,強烈建議您這麼做,因為 WinHTTP 中支援 DNS 名稱解析的逾時,就效能而言很昂貴。 針對 Windows 2000 和更新版本,不需要在 WinHTTP 中設定 DNS 解析逾時,因為基礎 DNS 用戶端服務會實作自己的解析逾時。
  • 處理非同步要求時,WinHTTP 不會正確處理執行緒模擬。 這會導致要求需要 NTLM/Negotiate 驗證失敗,除非使用 WinHttpSetCredentialsWinHttpSetOption 函式明確指定認證。