Ошибка XmlHttpRequest? - PullRequest
       1

Ошибка XmlHttpRequest?

3 голосов
/ 24 мая 2010

Я пишу программу, которая, помимо прочего, должна загружать файл с учетом его URL. Мне лень внедрять протоколы Http / Https вручную, поэтому мне нужна была библиотека / объект / функция, которая будет выполнять эту работу.

Критическое требование : загрузка должна быть асинхронной. То есть поток, который произвел загрузку, должен иметь возможность делать что-то еще «во время» загрузки файла, плюс загрузка должна быть в состоянии прервать в любое время без каких-либо варварских побочных эффектов (таких как внутренний вызов TerminateThread).

Хорошие требования:

  • Должен быть в состоянии загрузить файл "в память". Средства - читать содержимое файла по мере его поступления, не обязательно сохранять его в каком-либо файле "файловой системы".
  • Было бы неплохо иметь некоторый удобный механизм уведомления о прогрессе Win32 (ожидаемое событие, семапор, порт завершения и т. Д.), А не просто периодически запрашивать состояние загрузки.

Я выбрал XmlHttpRequest COM-объект для выполнения работы. Казалось, что он работает достаточно хорошо, плюс он поддерживает асинхронный режим.

Однако я заметил, что через некоторое время он просто перестает работать. То есть после нескольких успешных загрузок файлов он перестает что-либо загружать.

Я периодически опрашиваю его, чтобы получить его статус, он сообщает "в процессе", но на самом деле ничего не происходит, и нет сетевой активности. Более того, когда тот же процесс создает другой экземпляр объекта XmlHttpRequest для выполнения новых загрузок - эффект тот же. Объект сообщает «в процессе», в то время как он даже не пытается подключиться к серверу (согласно снифферам сети и состоянию TCP системы).

Единственный способ вернуть этот объект обратно - это перезапустить процесс. Это заставляет меня подозревать, что в объекте есть какая-то ошибка (извините, я имел в виду недокументированная функция ). Также это не ошибка на уровне отдельного объекта, так как проблема сохраняется, когда объект уничтожается и создается другой. Вероятно, это некоторое глобальное состояние библиотеки DLL, которая реализует этот объект.

Кто-нибудь знает что-нибудь об этом? Это известная ошибка? Я почти уверен, что в моем коде нет другой ошибки, из-за которой, как мне кажется, ошибка в XmlHttpRequest. Я провел достаточное количество тестов и провел время с отладчиком, чтобы без всяких сомнений сделать вывод, что просто объект перестает работать.

Кстати, пока объект должен работать, я делаю все ожидания с помощью MsgWaitXXXX вызовов API. Так что, если этот объект нуждается в работе цикла сообщений (например, он может создать скрытое окно уведомлений и привязать его к сокету через WSAAsyncSelect) - я даю ему такую ​​возможность.

1 Ответ

1 голос
/ 24 мая 2010

Из своего собственного опыта я знаю, что реализация Microsoft XmlHttpRequest не полностью соответствует черновому стандарту . В частности, стандартные мандаты для потоковых данных могут быть извлечены в состоянии готовности «3» (получение), которое IE намеренно игнорирует .

К сожалению, я не видел, что вы описываете, несмотря на широкое использование объектов XmlHttpRequest для длительных опросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...