共用方式為


WinHTTP 中的 AutoProxy 問題

使用 WinHTTP autoproxy 功能時,請考慮下列重要問題。

目前僅支援一部 Proxy 伺服器

WinHTTP 目前不支援指定多個 Proxy 伺服器的 Proxy 組態。 如果 WinHttpGetProxyForUrl 傳回 WINHTTP_PROXY_INFO 結構,其中包含 Proxy 伺服器清單,應用程式接著會使用 [WINHTTP_OPTION_PROXY] 選項在要求句柄上設定,WinHTTP 只會使用清單中的第一個 Proxy 伺服器。 如果無法存取該 Proxy 伺服器,WinHTTP 不會故障轉移至清單中的任何其他 Proxy 伺服器。 應用程式必須再次使用清單中的下一個 Proxy 伺服器設定 WINHTTP_OPTION_PROXY 選項,然後重新傳送要求,以處理此案例。

安全性風險降低

處理 Proxy 自動組態檔需要執行下載的腳本程序代碼。 需要考慮一些安全性考慮:如果 PAC 檔案所在的伺服器遭到入侵,PAC 腳本程式代碼可能是惡意的。 因此,WinHTTP 會使用下列預防措施來保護用戶端:

  1. 腳本程式代碼無法具現化任何 ActiveX 物件。 這會封鎖許多潛在的危險功能,例如存取檔案和執行網路 I/O 的能力。

  2. **Windows Server 2003: **WinHttpGetProxyForUrl 將整個 WPAD 處理委派給外部跨進程服務 WinHTTP Web Proxy 自動探索服務,此服務是在低許可權本地服務內建用戶帳戶下執行。

  3. SP2 和 Windows Server 2003 的 Windows XP: 不允許 PAC 腳本執行超過 60 秒,之後腳本執行就會終止。

  4. 具有SP2和 Windows Server 2003 的 Windows XP: WinHTTP 會拒絕大於 1MB 的 PAC 檔案。 一般 PAC 檔案的大小通常不超過幾 KB。

請注意,處理 PAC 腳本程式代碼需要使用 COM,因為 WinHTTP 會使用 Microsoft JScript 元件來執行腳本。 如果 WinHTTP 無法將 WPAD 通訊協定處理委派給外部、跨進程 Web Proxy 自動探索服務,WinHttpGetProxyForUrl 在呼叫期間於應用程式進程內載入 COM 運行時間。 如果應用程式本身已經使用 COM,則這不應該是問題。

效能考慮

自動偵測程式可能很慢,可能只要幾秒鐘。 WinHttpGetProxyForUrlWinHttpDetectAutoProxyConfigUrl 函式封鎖同步函式。 可能是其中一個特定的自動偵測機制(例如 DHCP)比另一個 (例如 DNS) 慢得多。 如果同時指定 WINHTTP_AUTO_DETECT_TYPE_DHCPWINHTTP_AUTO_DETECT_TYPE_DNS_A 自動偵測旗標,WinHTTP 會先根據 WPAD 規格使用 DHCP。 如果發出 DHCP 要求來探索任何 PAC URL,則 WinHTTP 會嘗試在已知的 DNS 位址找到 PAC 檔案。

WinHttpGetProxyForUrl 使用 WinHTTP 會話句柄參數來快取 PAC 檔案和自動偵測的結果。 最好針對多個 WinHttpGetProxyForUrl 使用相同的會話句柄, 呼叫,以避免重複的 PAC URL 偵測和檔案下載。 PAC 檔案只會在記憶體中快取,並在應用程式關閉會話句柄時捨棄。

由於 autoproxy 的效能影響,建議只使用桌面用戶端應用程式或服務使用此功能;伺服器型應用程式應該依賴伺服器管理員,並使用 「ProxyCfg.exe」 公用程式。