WinHTTP 5.1 中的新增功能

本主题介绍 WinHTTP 版本 5.1 和版本 5.0 之间的最重要差异。 其中许多差异需要在从版本 5.0 迁移到版本 5.1 的应用程序中更改代码。 版本 5.1 中的某些功能仅从 Windows Server 2003 和 Windows XP Service Pack 2 (SP2) 开始可用,尤其是与提高客户端针对恶意 Web 服务器的安全性相关的功能。

重要

随着 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) 及更高版本的操作系统。 (.msm) 文件的可再发行合并模块不适用于 WinHTTP 5.1。

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 凭据查找也处于禁用状态。
  • 重定向行为更改:出于安全原因,默认情况下不再自动遵循从安全 https: URL 到常规 http: 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 开始,WinHTTP 在 HTTP 响应中接受的最大标头数据量默认为 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 专业版或带 SP1 的 Windows XP 上,使用以下选项 ID 调用 WinHttpSetOptionWinHttpQueryOption 会失败:

“\#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 和 Windows XP SP2 开始,可以使用以下新的 WinHttpRequest 5.1 选项:

“WinHttpRequestOption\_MaxAutomaticRedirects” “WinHttpRequestOption\_MaxResponseHeaderSize” “WinHttpRequestOption\_MaxResponseDrainSize” “WinHttpRequestOptions\_EnableHttp1\_1”

当自动登录安全性设置为“高”时,代理不受信任

在 WinHTTP 5.0 中,始终信任代理服务器进行自动登录。 如果设置了 WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH 策略选项,则对于 Windows Server 2003 和 Windows XP SP2 上运行的 WinHTTP 5.1 不再有效。

Web 代理自动发现 (AutoProxy) API

为了简化基于 WinHTTP 的应用程序的代理设置的配置,WinHTTP 现在实现了 Web 代理自动发现 (WPAD) 协议,也称为 autoproxy。 这与 Web 浏览器(如 Internet Explorer)实现的协议相同,无需最终用户手动指定代理服务器即可自动发现代理配置。 为了支持 autoproxy,WinHTTP 5.1 实现了新的 C/C++ 函数 WinHttpGetProxyForUrl,以及两个支持函数 WinHttpDetectAutoProxyConfigUrlWinHttpGetIEProxyConfigForCurrentUser

已知问题

Windows 2000 专业版 SP3 和 Windows XP SP1 上的 WinHTTP 5.1 中已知存在以下问题。 从 Windows Server 2003 开始的 WinHTTP 和 SP2 的 Windows XP 解决了这些问题:

  • 如果应用程序使用 WinHttpSetTimeouts 函数或 WinHttpRequest 组件上的 SetTimeouts 方法设置非无限 DNS 解析超时(如 dwResolveTimeout 参数),则每次 WinHTTP 解析 DNS 名称时,都会发生线程句柄泄漏。 对于大量的 HTTP 请求,这会导致严重的内存泄漏。 解决方法是保留默认的无限解析超时设置不变, (值为 0 指定无限超时) 。 在任何情况下都强烈建议这样做,因为支持 WinHTTP 中的 DNS 名称解析超时在性能方面成本高昂。 对于 Windows 2000 及更高版本,不需要在 WinHTTP 中设置 DNS 解析超时,因为基础 DNS 客户端服务会实现其自己的解析超时。
  • 处理异步请求时,WinHTTP 不会正确处理线程模拟。 这会导致需要 NTLM/协商身份验证的请求失败,除非使用 WinHttpSetCredentialsWinHttpSetOption 函数显式提供凭据。