Я пишу программу, которая, помимо прочего, должна скачать файл с его URL-адресом. Я слишком ленив, чтобы реализовать протоколы Http/Https вручную, так что мне понадобилась библиотека/объект/функция, которые будут выполнять эту работу.Ошибка XmlHttpRequest?
Критическое требование: Загрузка должно быть быть асинхронным. То есть, поток, который выдает загрузку, должен иметь возможность делать что-то еще «пока», загружая файл, а также загружать его в любое время без каких-либо варварских побочных эффектов (например, внутренний вызов TerminateThread
).
Nice-на-есть требования:
- должны быть в состоянии загрузить файл "в память". Средства - читайте содержимое файла по мере их поступления, не обязательно сохраняйте его в файле «файловой системы».
- Было бы неплохо иметь удобный механизм уведомления о событиях Win32 (ожидаемое событие, semahpore, порт завершения и т. Д.), А не просто периодически проверять статус загрузки.
Я выбрал COM-объект XmlHttpRequest
для выполнения работы. Он, казалось, работал достаточно хорошо, плюс поддерживал асинхронный режим.
Однако я заметил, что через некоторое время он просто перестает работать. То есть, после нескольких успешных скачиваний файлов он перестает загружать что-либо.
Я периодически опроса его, чтобы получить его статус, он сообщает «в процессе», но ничего на самом деле не происходит, и нет активности в сети. Более того, когда тот же процесс создает другой экземпляр объекта XmlHttpRequest
для выполнения новых загрузок - эффект тот же. Объект сообщает «in progress», в то время как он даже не пытается подключиться к серверу (в соответствии с сетевыми снифферами и системным TCP-состоянием).
Единственный способ вернуть этот объект обратно - это перезапустить процесс. Это заставляет меня подозревать, что есть какая-то ошибка (извините, я имел в виду недокументированная функция) в объекте. Также это не ошибка на уровне отдельного объекта, так как проблема сохраняется, когда объект уничтожается, а другой создается. Вероятно, это какое-то глобальное состояние DLL, которое реализует этот объект.
Кто-нибудь знает что-нибудь об этом? Это известная ошибка? Я уверен, что нет никакого шанса, что у меня есть еще одна ошибка в моем коде, из-за которой мне кажется, что ошибка была в XmlHttpRequest
. Я сделал достаточно тестов и провел время с отладчиком, чтобы заключить без сомнений, что это просто объект перестает работать.
BTW, в то время как объект должен работать, я все время ожидаю через вызовы API MsgWaitXXXX
. Чтобы этот объект нуждался в правильной работе цикла сообщений (например, он может создать скрытое окно уведомлений и привязать его к сокету через WSAAsyncSelect
). Я даю ему возможность.
Я только что написал небольшую тестовую программу, и я не видел никаких проблем; можете ли вы создать минимальный образец кода, который обнаруживает проблему? – Luke