WinHTTP 5.1 中的新增功能
本主题介绍了 WinHTTP 版本 5.1 和版本 5.0 之间的最重要的差异。 其中许多差异需要从版本 5.0 迁移到版本 5.1 的应用程序中的代码更改。 从 Windows Server 2003 开始,版本 5.1 中的一些功能仅在 Windows Server 2003 和 Windows XP 以及 Service Pack 2 (SP2) 上可用,尤其是与提高客户端对恶意 Web 服务器安全性相关的功能。
重要
随着 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 和 Service Pack 3 (SP3)、Windows XP 和 Service Pack 1(SP1) 及更高版本的操作系统。 可再发行合并模块 (.msm) 文件不适用于 WinHTTP 5.1。
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 凭据查找也处于禁用状态。
- 重定向行为更改:由于安全原因,从安全 https: URL 到常规 http: 的重定向不再默认自动遵循。 有一个新选项,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 SP2 开始,HTTP 响应中 WinHTTP 接受的最大标头数据量默认为 64K。 如果服务器 HTTP 响应包含的头数据总量超过 64K,WinHTTP 将导致请求失败,并发出 ERROR_WINHTTP_INVALID_SERVER_RESPONSE 错误。 可以使用新的 WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE 选项重写此 64K 限制。
IPv6 支持
WinHTTP 5.1 增加了对 Internet 协议版本 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 上,使用这些选项 ID 调用 WinHttpSetOption 或 WinHttpQueryOption 失败:
- "\#define WINHTTP\_OPTION\_RECEIVE\_RESPONSE\_TIMEOUT 7" "\#define WINHTTP\_OPTION\_MAX\_HTTP\_AUTOMATIC\_REDIRECTS 89" "\#define WINHTTP\_OPTION\_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"
从 Windows Server 2003 开始,可以使用以下新的 WinHttpRequest 5.1 选项和 SP2 的 Windows XP:
- "WinHttpRequestOption\_MaxAutomaticRedirects" "WinHttpRequestOption\_MaxResponseHeaderSize" "WinHttpRequestOption\_MaxResponseDrainSize" "WinHttpRequestOptions\_EnableHttp1\_1"
当自动登录安全性设置为“高”时,代理不受信任
在 WinHTTP 5.0 中,始终信任代理服务器进行自动登录。 设置 WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH 策略选项时,在 Windows Server 2003 和具有 SP2 的 Windows XP 上运行的 WinHTTP 5.1 不再有效。
Web Proxy Auto-Discovery (AutoProxy) API
为了简化基于 WinHTTP 的应用程序的代理设置的配置,WinHTTP 现在实现了 Web 代理自动发现 (WPAD) 协议,也称为 autoproxy。 这与 Web 浏览器(如 Internet Explorer)实现的协议相同,无需最终用户手动指定代理服务器即可自动发现代理配置。 为了支持 autoproxy,WinHTTP 5.1 实现了新的 C/C++ 函数 WinHttpGetProxyForUrl 以及两个支持函数:WinHttpDetectAutoProxyConfigUrl 和 WinHttpGetIEProxyConfigForCurrentUser。
已知问题
Windows 2000 Professional 上的 SP3 和 WINDOWS XP SP1 上的 WinHTTP 5.1 中已知存在以下问题。 从 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 函数明确提供凭据。