【问题标题】:Why would InternetOpenURL report error 2 (the system cannot find the file specified)?InternetOpenURL为什么会报错2(系统找不到指定的文件)?
【发布时间】:2011-04-13 08:54:23
【问题描述】:

我们产品中的互联网访问代码适用于 99.99% 的人。但是,对于其中一些人来说,它根本不起作用。我们一直在添加一些跟踪代码来尝试找出问题所在,结果 InternetOpenURL 报告错误 2 - “系统找不到指定的文件” - 来自此函数调用:

options = INTERNET_FLAG_RAW_DATA | INTERNET_FLAG_RESYNCHRONIZE;
handle = InternetOpenUrl(internet,url,NULL,0,options,0);

(internet 是使用 InternetOpen 打开的 Internet 连接的句柄,url 是我们网络服务器上存在的简单文本文件的 URL。)

我们测试了两个不同的网站,一个 http 和一个 https,它们位于完全不同的地方(不同的域、托管在地理位置上的服务器),并且对于这个人和其他一些人,它们都给出了相同的错误。 99% 的人,包括我们自己,都可以毫无问题地访问它们。不仅如此,受影响的人可以在他们的网络浏览器中毫无问题地访问相同的 URL。

这里到底发生了什么? :(

编辑:幸运的是,我们发现了问题所在!事实证明,有些人在他们的 Internet 选项中选中了“为 LAN 使用代理服务器”复选框,而没有实际指定代理服务器。我们试图使用不存在的代理服务器详细信息,当然会遇到问题。

我仍然需要为此研究一种程序化解决方案,但是报告问题的每个人都已通过此解决方案解决了他们的问题:

  1. 打开 Internet Explorer
  2. 转到“工具 -> Internet 选项”
  3. 点击“连接”标签。
  4. 在底部附近应该有一个标有“LAN 设置”的按钮。点击它。
  5. 在“代理服务器”字段下,取消选中“为您的 LAN 使用代理服务器”
  6. 全部点击确定,重启 Windows,然后再次尝试通过产品访问互联网。

我不知道为什么这么多人选中了该框,但没有指定代理服务器。但显然这是修复它需要做的。

【问题讨论】:

  • 您是否尝试过使用诸如wireshark之​​类的东西来嗅探来回发送的实际数据包?因为这不仅可以揭示您遇到的错误(例如某种形式的转换或缺少转换,即:' ' to %20)
  • 不幸的是,这发生在我们无法访问的用户机器上,因此我们无法进行任何类型的调试。 :(

标签: winapi wininet


【解决方案1】:

GetLastError() 可能不是找出问题所在的最佳方法。来自docs

要确定拒绝访问服务的原因,请致电InternetGetLastResponseInfo

【讨论】:

  • InternetGetLastResponseInfo 文档说你应该只在 GetLastError 返回 ERROR_INTERNET_EXTENDED_ERROR 时才调用它,而这并没有发生。这不正确吗?
  • @Colen:听起来它适用于 FTP URL。还是试试吧,看看你会得到什么!
【解决方案2】:

鉴于此信息,我猜这些用户的防火墙(或某种类型的安全软件)已经挂上了 wininet 并干扰了您的通话。或者,它们可能感染了恶意软件。

【讨论】:

    【解决方案3】:

    解决方案可能就像打开 Internet Explorer 一样简单。我从不使用浏览器,但 Windows 更新中断了对 InternetOpenUrl 的调用。

    打开 IE 将设置选项,以便再次读取代理信息。请注意,在 InternetOpen() 中使用 INTERNET_OPEN_TYPE_PRECONFIG 时这一点很重要。

    最初我只在设置 INTERNET_FLAG_RELOAD 时看到问题,但很快一切都降级了,以至于普通的普通连接也失败了。

    tl;dr打开 IE,这样它就可以祝福你的系统了

    【讨论】:

    • 另一个原因显然是 IE 设置为在离线模式下工作。
    【解决方案4】:

    这些用户是否使用代理?如果他们在 IE 中设置了代理,则有可能正在获取信息并导致您的错误。

    另外,我同意休的观点。有时 GetLastError() 可能会产生误导。如果你想使用它,你应该确保在调用之前设置了 SetLastError(0),否则你可能会得到一个由之前的方法调用设置的错误代码。

    【讨论】:

    • 我们已经先调用了 SetLastError(0),但感谢您的提示。用户说他们没有设置代理——这实际上是我们检查的事情之一,因为类似的问题是由用户检查了“使用代理”但没有指定实际代理引起的。
    • 您在服务器日志中看到此请求的任何信息吗?也许请求正在发送到服务器并且服务器正在向这些用户发送一些错误/意外的响应?本质上,我们确定这是客户端问题而不是服务器问题吗?
    【解决方案5】:

    尝试以下方法:

    发生错误时,挂钩 SetLastError 函数(手动使用热补丁,或使用 MS Detours 或其他方法),然后再次调用 InternetOpenUrl。

    在挂钩函数中,如果 SetLastError 参数不为零,则进行小型转储。你会得到一个设置错误的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2018-06-11
      • 2021-07-14
      • 2014-04-12
      相关资源
      最近更新 更多