除了一些例外情况,WinINet 是 winHTTP 的超集。 在两者之间进行选择时,应使用 WinINet ,除非你打算在需要模拟和会话隔离的服务或类似服务的进程中运行。
功能比较
| 功能 | WinINet | WinHTTP |
|---|---|---|
| 凭据缓存。 允许 Windows Internet Explorer 中的所有内置应用程序自动获取凭据。 它还允许在 Internet Explorer 外运行的应用程序仅提示/指定一次服务器的凭据。 此后,请求是自动的。 | 是的 | 不 |
| 凭据提示。 提供一个 API,允许调用代码提示用户输入凭据。 | 是的 | 不 |
| FTP | 是的 | 不 |
| 自动拨号/RAS 支持。 这是旧功能。 请改用 远程访问。 | 是的 | 不 |
| 区域。 自动与 Internet Explorer 安全区域集成。 | 是的 | 不 |
| IDNA 支持。 对 IDNA RFC/Punycode 的集成支持。 | 是的 | 是的 |
| Cookie Jar API。 支持持久性和非持久性 Cookie。 任何应用程序或脚本都可以使用它来查看与浏览器相同的 Cookie。 | 是的 | 不 |
| IE 保护模式支持 | 是的 | 不 |
| 解压缩支持。 支持 gzip 和 deflate 压缩格式。 | 是的 | 是的 |
| 分块上传支持。 客户端代码必须执行分块。 | 不 | 是的 |
| SOCKS4(SOCKS 版本 4)支持。 不包括 v4a。 | 是的 | 不 |
| SOCKS5(SOCKS 版本 5)支持 | 不 | 不 |
| 双向发送和接收 | 不 | 不 |
| 重叠 I/O | 不 | 不 |
| 文件方案支持。 对使用 file 协议的代理脚本很有用。 | 是的 | 不 |
| InternetOpenUrl。 简化的代码以打开 URL。 | 是的 | 不 |
| 服务支持。 可以从服务或服务帐户运行。 | 不 | 是的 |
| 会话隔离。 单独的会话不会相互影响。 | 不 | 是的 |
| 冒充。 支持在线程模拟不同用户时被调用。 | 不 | 是的 |
相关主题
快速决策指南
使用此流程图选择正确的 HTTP 客户端堆栈:
-
你的代码是否在 Windows 服务中、系统进程中,或以模拟身份运行?
- 是→使用 WinHTTP。
-
你的代码是需要用户的 Internet 选项(IE)代理设置、Cookie 或凭据提示的桌面应用吗?
- 是→使用 WinINet。
-
你是编写新式 C++ 桌面还是 UWP/WinUI 应用?
- 是→使用Windows。Web.Http (C++/WinRT 通过Windows。Web.Http 命名空间)。
-
是否正在编写.NET应用程序?
- 是→使用 System.Net.Http.HttpClient。
-
是否需要跨平台兼容性?
- 是→使用 libcurl 或类似的可移植库。
注释
何时既不使用 WinINet 也不使用 WinHTTP — 如果要生成新应用程序,并且不需要旧版 Win32 集成,则首选上面列出的新式替代项。 它们提供更简单的 API 和更好的异步支持。 一些替代方法还提供其他优势:libcurl 和 .NET HttpClient 是跨平台的;TLS 1.3 可用性取决于基础 TLS 堆栈和 OS 配置。 对于需要 Win32 服务支持、浏览器凭据共享或深度代理集成的方案,保留 WinHTTP/WinINet。
Important
安全提醒——无论选择哪种 HTTP 堆栈,在生产环境中都切勿禁用 TLS 证书验证。 WinHTTP 和 WinINet 都允许通过标志忽略证书错误,但这样做会将应用程序公开为中间人攻击。