2010-05-24 3 views
3

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

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

Nice-на-есть требования:

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

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

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

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

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

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

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

+0

Я только что написал небольшую тестовую программу, и я не видел никаких проблем; можете ли вы создать минимальный образец кода, который обнаруживает проблему? – Luke

ответ

1

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

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

+0

Хорошо, если вы никогда не видели такой симптом - это имеет смысл. Это заставляет меня подозревать, что проблема в моем коде тем не менее ... Кстати, может быть, моя проблема в том, что я не пытаюсь читать что-либо из obj, пока его «readyState» не изменится на «4». Возможно, объект просто ждет, пока я не прочитаю что-нибудь из него, чтобы он продолжал читать с сервера? Как вы думаете? – valdo

+0

Вам не повезет, если вы используете стандартную реализацию IE. Он не позволит вам получить доступ к потоку данных до состояния готовности «4» (полный), поэтому я не думаю, что это ваша проблема: - / – Konrad

Смежные вопросы