代码之家  ›  专栏  ›  技术社区  ›  Francis

使用WinINET为虚拟用户创建健壮的HTTP连接

  •  5
  • Francis  · 技术社区  · 15 年前

    Wininet家族API,因为我想利用它与IE兼容的代理行为。大家都知道,当前的IE有几个代理设置:自动检测(WPAD)、自动配置(PAC)、手动单个URL、每个协议的代理服务器、socks、direct。。。对于大多数用户来说,“直接下载”工作得很好;但是对于一些用户(尤其是那些在防火墙/NAT之后的用户),他们在建立连接时总是需要特殊的代理设置。

    编写代码来处理所有这些情况是很痛苦的,所以我希望WinINET InternetOpen (INTERNET_OPEN_TYPE_PRECONFIG) 可以帮我。对大多数用户来说是这样,但是我仍然发现一些用户抱怨连接失败。这些用户可能有非常特殊的网络环境(例如,代理需要用户名/密码验证),直接连接对他们不起作用。

    有时虚拟用户配置错误,我希望wininet为我尝试“所有”可能的代理设置;不幸的是 INTERNET_OPEN_TYPE_PRECONFIG 将只尝试用户配置的,而不是“所有可能的代理设置”。

    有没有什么方法可以在不需要处理代理的情况下建立HTTP连接?(即,一个“超级”连接求解器,它将尝试所有可能的代理设置),或者如果有任何方法告诉WinINET启用其所有代理设置来创建连接?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Community Lee Campbell    7 年前

    一个合理的算法是:

    1. 尝试使用用户当前的代理设置(即IE使用的代理设置)进行连接。这些是最有可能工作的。见 WinHttpGetIEProxyConfigForCurrentUser() 在MSDN上获取这些设置,或者 INTERNET_OPEN_TYPE_PRECONFIG 在WinINet。

    2. 如果失败,请使用 WinHttpGetProxyForUrl . ( WPAD 是客户可以自动找到 Proxy Auto-Config (PAC) 在网络(通常是公司网络)上的文件。)您将要选择此选项来检查代理文件的DHCP和DNS。 WinHTTP AutoProxy Functions 在MSDN上包含一个使用此API的代码示例和许多支持信息。如果成功,您将获得代理信息,然后可以将其插入到HTTP下载代码中。AFAIK,没有等效的WinINet选项来自动执行新的WPAD检测——只有WinHTTP。

    3. 接下来,您可以尝试查找Firefox代理设置。 This SO answer

    4. 如果以上所有操作都失败了,您就别无选择,只能要求用户手动指定其代理信息。您可能希望克隆IE或firefox的代理UI,并在下载该文件时将这些UI设置转换为适当的参数来配置代理选项。

    请注意,代理检测没有魔力——您可以选择使用用户设置、使用默认计算机设置、使用直接连接、使用WPAD查找PAC文件或询问用户。不幸的是,没有办法“在不需要处理代理的情况下建立HTTP连接”。

    顺便说一句,虽然您可以只使用WinHTTP进行代理检测,然后使用WinINet获取文件,但我建议在这两部分都使用WinHTTP。当您希望对HTTP交互具有最大的灵活性和控制权(以及比WinINet更好的稳定性)时,WinHTTP是首选。

    J、 J.有一个好主意——我添加了一个检查Firefox代理设置的步骤。由于古怪的代理通常出现在公司环境中(这些环境倾向于在IE上标准化),这有点不太可能有帮助,但值得一试。

    更新: 我刚刚编辑了上面的部分,以回应Francis的正确评论:严格意义上说,WinHTTP不是WinINet的“继承者”(意味着WinINet的100%特性在WinHTTP中是可用的)。相反,WinHTTP是为使用HTTP进行数据交换的应用程序而设计的,它们不关心与Interet Explorer的缓存、cookies、拨号UI等集成。

    服务器应用程序绝对属于这一类(WinHTTP与WinINet不同,在服务器应用程序中使用是安全的),但许多客户端软件也会使用它,例如每台现代PC上的Windows Update客户端,对于需要通过HTTP下载文件、需要对网络进行更细粒度控制并希望控制自己的UI的客户端应用程序,WinHTTP更为可取。

        2
  •  1
  •   Kevin Condon    12 年前

    我对这个过程最好的描述是 How the Windows Update client determines which proxy server to use to connect to the Windows Update Web site WinHttpGetIEProxyConfigForCurrentUser , WinHttpDetectAutoProxyConfigUrl , WinHttpGetProxyForUrl WinHttpGetDefaultProxyConfiguration

    以下是知识库文章的顺序:

    1. 找不到PAC文件?如果用户设置了IE自动配置脚本,请使用该PAC文件。
    2. 仍然没有找到PAC文件?寻找代理。如果用户已手动配置IE代理设置,请使用它们。
    3. 没有配置默认代理?使用直接连接。