在 WinHTTP 中设置 WinINet 代理配置

在 Win 上设置自动代理HTTP 5.1

从 WinINet 移植到 WinHTTP 的应用程序可能需要使用可在 WinINet 或 Internet Explorer (IE) 下检索的相同 autoproxy 设置。 WinHTTP 版本 5.1 API 可以检索并使用这些代理设置。 通常,WinHTTP 在创建会话时按会话指定代理和代理绕过服务器。 可以基于每个请求重写这些设置。

若要使用与 WinINet 或 IE 相同的代理配置,WinHTTP 客户端应设置会话的代理设置。 此外,如果 IE 或 WinINet 配置为使用 Web 代理自动发现 (WPAD) ,则使用这些设置的 WinHTTP 客户端必须基于每个请求设置代理设置。 以下部分介绍如何指定会话和请求的代理设置:

在会话上设置代理配置

应用程序在用户帐户上运行

在创建会话之前,应用程序会调用 WinHttpGetIEProxyConfigForCurrentUser 来获取 IE 代理设置。 应用程序必须以用户帐户身份运行才能获取这些设置。 pProxyConfig 参数是指向WINHTTP_CURRENT_USER_IE_PROXY_CONFIG结构的指针,该结构包含代理名称 (lpszProxy) 和代理绕过 (lpszProxyBypass) 服务器。 然后使用 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG 结构的代理名称和代理绕过值来初始化 WinHTTP 会话。 通过使用从 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG 结构的lpszProxy 和 lpszProxyBypass 成员获取的 pwszProxyNamepwszProxyBypass 参数调用 WinHttpOpen 来初始化会话。

应用程序作为服务运行

应用程序必须确保在调用 WinHttpGetIEProxyConfigForCurrentUser 之前将单个用户的注册表设置加载到注册表中。 如果未将这些设置加载到注册表中, WinHttpGetIEProxyConfigForCurrentUser 将无法获取代理设置。 可以通过调用 LoadUserProfile 函数将单个用户的注册表设置加载到注册表中。 如果无法加载用户的注册表设置,应用程序可以使用 dwAcessType 参数中指定的WINHTTP_ACCESS_TYPE_DEFAULT_PROXY调用 WinHttpOpen。 在调用 WinHttpOpen 时指定默认代理会告知 WinHTTP API 使用 WinHTTP proxycfg.exe 实用工具检索代理配置集。 加载单个用户的注册表设置后,应用程序将按照 应用程序在用户帐户上运行 下概述的步骤来设置代理名称和代理绕过服务器。

在单个请求上设置代理配置

在创建会话之前,应用程序调用 WinHttpGetIEProxyConfigForCurrentUser 以确定 WinINet 和 IE 是否配置为使用 WPAD。 WinHttpGetIEProxyConfigForCurrentUser 返回包含 fAutoDetect 成员的 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG 结构。 此成员的值为 TRUE 表示使用了 WPAD,并且 lpszAutoConfigUrl 成员包含 WPAD URL。

使用自动代理配置

如果使用 WPAD,应用程序会调用 WinHttpGetProxyForUrl 来检索请求的代理。 lpwszUrl 参数包含请求要发送到的 URL,pAutoProxyOptions 参数包含指向包含 autoproxy 选项WINHTTP_AUTOPROXY_OPTIONS) 结构的指针 (。 应用程序使用调用 WinHttpGetIEProxyConfigForCurrentUser 时从 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG 结构返回的设置初始化 WINHTTP_AUTOPROXY_OPTIONS 结构。 WINHTTP_AUTOPROXY_CONFIG_URL 标志在 WINHTTP_AUTOPROXY_OPTIONS 结构的 dwFlags 成员中指定,lpszAutoconfigUrl 成员包含WINHTTP_CURRENT_USER_IE_PROXY_CONFIG结构的代理自动配置 URL。 WinHttpGetProxyForUrl 函数返回WINHTTP_PROXY_INFO结构的 lpszProxylpszProxyBypass 成员中的代理名称和代理绕过列表。

WinHttpGetProxyForUrl 获取请求的代理后,应用程序使用 WinHttpOpenRequest 创建请求。 然后调用 WinHttpSetOption ,通过在 hInternet 参数中指定请求句柄来设置请求的代理。 调用 WinHttpSetOption 中的 dwOption 参数应设置为 WINHTTP_OPTION_PROXYlpBuffer 参数是指向包含要用于请求的代理和代理旁路的WINHTTP_PROXY_INFO结构的指针。

不使用自动代理配置

如果对 WinHttpGetIEProxyConfigForCurrentUser 的 调用指示不使用 autoproxy,则应用程序只需使用 WinHttpOpenRequest 创建请求。 代理配置对整个会话都是相同的,并且不需要按请求进行更改。