WinHTTP 5.1 的新功能
本主題描述 WinHTTP 5.1 版與 5.0 版之間最重要的差異。 其中許多差異需要在從 5.0 版移轉至 5.1 版的應用程式進行程式碼變更。 從 Windows Server 2003 和 Windows XP with Service Pack 2 (SP2) 開始,5.1 版的某些功能才可供使用,特別是與改善用戶端對惡意網頁伺服器安全性相關的功能。
重要
WinHTTP 5.1 版已不再提供 WinHTTP 5.0 下載。 自 2004 年 10 月 1 日起,Microsoft已移除 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 搭配 Service Pack 1(SP1)和更新版本的操作系統。 WinHTTP 5.1 無法使用可轉散發合併模組 (.msm) 檔案。
WinHttpRequest ProgID
WinHttpRequest 元件的 ProgID 已從 “WinHttp.WinHttpRequest.5” 變更為 “WinHttp.WinHttpRequest.5.1”。 WinHttpRequest 類別的 CLSID 也已變更。
異步回呼行為變更
在異步模式中呼叫 WinHttpWriteData、WinHttpQueryDataAvailable 和 WinHttpReadData 函式時,請勿依賴要設定的個別 lpdwNumberOfBytesWritten、lpdwNumberOfBytesAvailable 和 lpdwNumberOfBytesRead OUT 參数。 如果函式呼叫以異步方式完成,WinHTTP 不會寫入應用程式程式代碼所提供的這些指標。 相反地,應用程式應該使用 lpvStatusInformation 和 dwStatusInformationLength 參數來擷取這些值給回呼函式。
默認設定的變更
預設設定的變更包括:
- 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,因此只有系統管理員才能讀取或寫入檔案。 建立追蹤檔案的用戶帳戶也可以修改 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 和 Windows XP with SP2 開始,HTTP 回應中 WinHTTP 接受的標頭數據上限是 64K,預設為 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 上,呼叫 WinHttpSetOption 或 WinHttpQueryOption 時,這些選項標識符會失敗:
- “\#define WINHTTP\_OPTION\_RECEIVE\_RESPONSE\_TIMEOUT 7” “\#define WINHTTP\_OPTION\_MAX\_HTTP\_AUTOMATIC\_REDIRECTS 89” “\#define WINHTTP\_OPTION\_MAX\_HTTP\\_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 搭配 SP2 執行的 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,加上兩個支援函式 WinHttpDetectAutoProxyConfigUrl 和 WinHttpGetIEProxyConfigForCurrentUser。
已知問題
Windows 2000 Professional 上的 WinHTTP 5.1 中已知存在下列問題 SP3 和 Windows XP with SP1。 從 Windows Server 2003 和 SP2 的 Windows XP 開始,WinHTTP 已解決這些問題:
- 如果應用程式使用 WinHttpSetTimeouts 函式或 WinHttpRequest 元件上的 SetTimeouts 方法來設定非無限 DNS 解析逾時,例如 dwResolveTimeout 參數,則每次 WinHTTP 解析 DNS 名稱時,就會發生線程句柄流失。 在大量的 HTTP 要求中,這會導致嚴重的記憶體流失。 因應措施是將預設無限解析逾時設定維持不變(值為 0 指定無限逾時)。 在任何情況下,強烈建議這麼做,因為 WinHTTP 中的 DNS 名稱解析支援逾時,在效能方面成本很高。 針對 Windows 2000 和更新版本,在 WinHTTP 中設定 DNS 解析逾時是不必要的,因為基礎 DNS 用戶端服務會實作自己的解析逾時。
- 處理異步要求時,WinHTTP 不會正確處理線程模擬。 這會導致要求 NTLM/Negotiate 驗證失敗,除非使用 WinHttpSetCredentials 或 WinHttpSetOption 函式明確指定認證。