WinINet 与 WinHTTP

除了一些例外情况,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 客户端堆栈:

  1. 你的代码是否在 Windows 服务中、系统进程中,或以模拟身份运行?
    • 是→使用 WinHTTP
  2. 你的代码是需要用户的 Internet 选项(IE)代理设置、Cookie 或凭据提示的桌面应用吗?
    • 是→使用 WinINet
  3. 你是编写新式 C++ 桌面还是 UWP/WinUI 应用?
  4. 是否正在编写.NET应用程序?
    • 是→使用 System.Net.Http.HttpClient
  5. 是否需要跨平台兼容性?
    • 是→使用 libcurl 或类似的可移植库。

注释

何时既不使用 WinINet 也不使用 WinHTTP — 如果要生成新应用程序,并且不需要旧版 Win32 集成,则首选上面列出的新式替代项。 它们提供更简单的 API 和更好的异步支持。 一些替代方法还提供其他优势:libcurl 和 .NET HttpClient 是跨平台的;TLS 1.3 可用性取决于基础 TLS 堆栈和 OS 配置。 对于需要 Win32 服务支持、浏览器凭据共享或深度代理集成的方案,保留 WinHTTP/WinINet。

Important

安全提醒——无论选择哪种 HTTP 堆栈,在生产环境中都切勿禁用 TLS 证书验证。 WinHTTP 和 WinINet 都允许通过标志忽略证书错误,但这样做会将应用程序公开为中间人攻击。