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、service Pack 3 (SP3) Windows 2000 Professional Windows、Service Pack 1 (SP1) 及更高版本的操作系统的 XP。 可再发行合并模块 (.msm) 文件不适用于 WinHTTP 5.1。

WinHttpRequest ProgID

WinHttpRequest 组件的 ProgID 已从“WinHttp.WinHttpRequest.5”更改为“WinHttp.WinHttpRequest.5.1”。 WinHttpRequest 类的 CLSID 也发生了更改。

异步回调行为更改

在异步模式下调用 WinHttpWriteDataWinHttpQueryDataAvailableWinHttpReadData 函数时,不依赖于要设置的相应 lpdwNumberOfBytesWrittenlpdwNumberOfBytesAvailable 和 lpdwNumberOfBytesRead 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 凭据查找也处于禁用状态。
  • 重定向行为更改:由于安全原因,HTTP 从安全 http: 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 和 SP2 Windows XP 开始, 出于安全原因,将请求发送到以下已知非 HTTP 端口受到限制:21 (FTP) 、25 (SMTP) 、70 (GOPHER) 、110 (POP3) 、119 (NNTP) 、143 (IMAP) 。
  • 从 Windows Server 2003 开始,SP2 Windows XP,默认情况下,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 和 SP2 Windows XP 开始,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 和 SP2 Windows XP 开始,WinHTTP 5.1 实现以下新选项。 在 SP3 或 SP1 Windows XP 的 Windows 2000 Professional上,调用 WinHttpSetOptionWinHttpQueryOption 时,这些选项 ID 失败:

“\#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 开始可用,以及 SP2 的 Windows XP:

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

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

在 WinHTTP 5.0 中,代理服务器始终受信任,以便自动登录。 对于在 Windows Server 2003 上运行的 WinHTTP 5.1,并在设置WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH策略选项时使用 SP2 Windows XP,这不再有效。

Web 代理自动发现 (AutoProxy) API

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

已知问题

已知在 2000 Windows 2000 Professional SP3 的 WinHTTP 5.1 中存在以下问题,并使用 SP1 Windows XP。 从 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/协商身份验证的请求失败,除非使用 WinHttpSetCredentialsWinHttpSetOption 函数显式提供凭据。