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

XMLHttpRequest错误?

  •  3
  • valdo  · 技术社区  · 14 年前

    我正在编写一个程序,其中一个程序需要下载一个给定URL的文件。我太懒了,无法手动实现HTTP/HTTPS协议,所以我需要一些库/对象/函数来完成这项工作。

    关键要求 下载 必须 保持异步。也就是说,发布下载的线程必须能够在“下载”文件时执行其他操作,而且下载必须能够在任何时候中止,而不会产生任何野蛮的副作用(例如内部调用 TerminateThread )

    很高兴有要求:

    • 应能将文件下载到内存中。意味着-在文件到达时读取其内容,不必将其保存到某个“文件系统”文件中。
    • 最好有一些方便的win32进程通知机制(可等待事件、semapore、完成端口等),而不是定期地轮询下载状态。

    我选择了 XmlHttpRequest 要执行此工作的COM对象。它似乎工作得很好,而且支持异步模式。

    不过,我注意到,过了一段时间,它就停止工作了。 也就是说,在几个成功的文件下载之后,它将停止下载任何内容。

    我定期对它进行投票以了解其状态,它报告“正在进行”,但实际上没有发生任何事情,也没有网络活动。此外,当同一进程创建 XMLHTTPROQUEST 执行新下载的对象-效果相同。对象报告“正在进行”,而它甚至不尝试连接到服务器(根据网络嗅探器和系统TCP状态)。

    使此对象恢复工作的唯一方法是重新启动进程。这让我怀疑有一种虫子(对不起,我是说 未记录的功能 )在对象中。另外,它不是单个对象级别的bug,因为当对象被破坏并创建另一个对象时,问题仍然存在。可能是实现该对象的dll的某个全局状态。

    有人知道这件事吗?这是已知的错误吗? 我很确定在我的代码中不可能有另一个bug,因为在我看来,这个bug在 XMLHTTPROQUEST . 我做了大量的测试,花了大量的时间和调试程序一起得出结论,毫无疑问,这只是对象停止工作。

    顺便说一句,虽然对象应该工作,但我通过 MsgWaitXXXX API调用。因此,如果此对象需要消息循环才能正常工作(例如,它可以创建一个隐藏的通知窗口并通过 WSAAsyncSelect )-我给它机会。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Konrad    14 年前

    根据我自己的经验,我知道,XMLHttpRequest的Microsoft实现不完全符合 draft standard . 特别是标准规定,流式数据应能够在就绪状态“3”(接收)下提取,即 deliberately ignores .

    不幸的是,我没有看到您所描述的内容,尽管出于长轮询目的广泛使用了xmlhttpRequest对象。