【问题标题】:XmlHttpRequest bug?XmlHttpRequest 错误?
【发布时间】:2010-05-24 21:39:16
【问题描述】:

我正在编写一个程序,除其他事项外,它需要根据其 URL 下载文件。我懒得手动实现 Http/Https 协议,所以我需要一些库/对象/函数来完成这项工作。

关键要求:下载必须是异步的。也就是说,发出下载的线程必须能够“在”下载文件的同时做其他事情,而且下载必须能够随时中止而没有任何野蛮的副作用(例如对TerminateThread的内部调用)。

很好的要求:

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

我选择了XmlHttpRequest COM 对象来完成这项工作。它似乎工作得很好,而且它支持异步模式。

但是我注意到一段时间后它会停止工作。 也就是说,在多次成功下载文件后,它会停止下载任何内容。

我定期轮询它以获取其状态,它报告“进行中”,但实际上什么也没发生,也没有网络活动。此外,当同一进程创建另一个XmlHttpRequest 对象实例以执行新下载时 - 效果是相同的。该对象报告“进行中”,但它甚至不尝试连接到服务器(根据网络嗅探器和系统 TCP 状态)。

使该对象恢复工作的唯一方法是重新启动该过程。这让我怀疑对象中存在某种错误(抱歉,我的意思是未记录的功能)。这也不是单个对象级别的错误,因为当对象被销毁并创建另一个对象时问题仍然存在。可能是实现此对象的 DLL 的某种全局状态。

有人知道吗?这是一个已知的错误? 我很确定我的代码中不可能有另一个错误,因此在我看来,错误在XmlHttpRequest 中。我已经完成了足够多的测试,并花时间在调试器上,毫无疑问地得出结论,这只是对象停止工作。

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

【问题讨论】:

  • 我只是写了一个小测试程序,没有发现任何问题;你能生成一个显示问题的最小代码示例吗?

标签: c++ windows


【解决方案1】:

根据我自己的经验,我知道 XmlHttpRequest 的 Microsoft 实现不完全符合 draft standard。特别是标准要求流数据应该能够在就绪状态“3”(接收)中提取,即 IE deliberately ignores

很遗憾,尽管将 XmlHttpRequest 对象广泛用于长轮询目的,但我没有看到您所描述的内容。

【讨论】:

  • 好吧,如果您从未见过这样的症状 - 这是有道理的。这让我怀疑问题出在我的代码中......顺便说一句,也许我的问题是我不会尝试从 obj 中读取任何内容,直到它的“readyState”变为“4”。也许该对象只是在等待我从中读取某些内容,以便它继续从服务器读取?你怎么看?
  • 如果你使用标准的 IE 实现,你不会有太多的运气。它不允许您在就绪状态“4”(完成)之前访问数据流,所以我认为这不是您的问题:-/
猜你喜欢
  • 2016-06-18
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2017-07-19
相关资源
最近更新 更多