:: Visual Foxpro, Foxpro for DOS
Зависают удаленные запросы
AntonV
Автор

Сообщений: 50
Откуда: Верхняя Пышма
Дата регистрации: 06.01.2014
Здравствуйте!
В цикле посылаю запросы XMLHTTP.Open("GET","https://....
но иногда, примерно раз на 1000 успешных, ответа нет и цикл останавливается на этом месте. Как сделать, чтобы тогда этот запрос игнорировался и цикл продолжался дальше?
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Встает выполнение именно на строке XMLHTTP.Open("GET",... ?
Стоит на этой строке бесконечно?
Полный код цикла какой?

Да, вспомнил. Еще есть 2 способа применения обьекта - .Reset, и создание обьекта XMLHTTP заново. Можно поэкспериментировать...



Исправлено 1 раз(а). Последнее : of63, 19.10.17 09:26
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
AntonV
Автор

Сообщений: 50
Откуда: Верхняя Пышма
Дата регистрации: 06.01.2014
встает на операторе XMLHTTP.send, но не всегда. Бывает выполняется весь цикл полностью.

полный текст такой
scan
XMLHTTP = CREATEOBJECT("Msxml2.XMLHTTP")

XMLHTTP.Open("GET","https://"..., .F.)
XMLHTTP.send
if XMLHTTP.statustext = "OK"
ADOStream = CreateObject("ADODB.Stream")
ADOStream.type = 1
ADOStream.Open
ADOStream.Write(XMLHTTP.responseBody)
ADOStream.SaveToFile(LCLOCALFILE, 2)
ADOStream.Close
ADOStream = NULL
else
? 'Не удалось загрузить файл с сайта !'
? XMLHTTP.statustext
endif
XMLHTTP = NULL
dele file (LCLOCALFILE)
endscan
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
AntonV
Автор

Сообщений: 50
Откуда: Верхняя Пышма
Дата регистрации: 06.01.2014
Надо как-то по таймеру по какому то событию программу с этим циклом прерывать и перезапускать заново с того места, где остановилось.
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
* Кстати, в Open() есть еще параметры:
* [3] - [1,T] - асинхронный запрос (см. .readyState), 0,F - синхронный запрос (ожидаем ответ сервера бесконечно)
* [4,5] - userName, password - данные для HTTP-авторизации

Причина в XMLHTTP.Open("GET","https://"..., .F.)
Используй асинхронный запрос: (3)=.T.
В этом случае придется опрашивать на предмет "завершено" самостоятельно, также таймаут отслеживать. Примерно так:

m.t = DATETIME()
Do While !m.oXMLHTTP.readyState=4 && 0/1/2/3/4 - до Open / после .Open / отправлен (Запрос был передан) / Ответ сервера принят частично / Complete-соединение закрыто (используется только 4...)
* Это даст возможность отработать фокс-кодам в кнопках Click и других методах, когда выполняются обороты цикла
* Без этой команды - не будут отрабатываться
DOEVENTS && [FORCE] - Обеспечивает остановку выполнения программного кода Visual FoxPro пока выполняется системное событие Windows, например такое как перемещение указателя мышки.
=sleep(100) && не будем частить с опросом, дадим потоку, в котором крутится фокс, поделать что-то своё
IF DATETIME()-m.t>ТаймаутСек && по достижении таймаута - сбросим
EXIT
ENDIF
ENDDO
* Проверяем статус ответа (в текстовом виде):
* Можно также проверять .Status: 200 - OK, или 404 - Not Found, 304 - Not Modified, 301 - страница перемещена, и др
* Запросы по протоколам FTP, FILE:/// не возвращают статус, надо ждать .status=0
m.r = (m.oXMLHTTP.readyState=4 .AND.; && Complete
INLIST(m.oXMLHTTP.status,200,400)) && или statustext="OK", или "Запрос не понят" (400 возвратили мне, когда паспорт указал в неверном формате...)
* Наблюдал также .status=12031 - пишут, что такой код возвращает Аякс (AJAX), когда JavaScript недонастроен на нашем компе...
* 5:12002 ERROR_INTERNET_TIMEOUT
* 6:12007 ERROR_INTERNET_NAME_NOT_RESOLVED
* 7:12029 ERROR_INTERNET_CANNOT_CONNECT
* 8:12030 ERROR_INTERNET_CONNECTION_ABORTED
* 9:12031 ERROR_INTERNET_CONNECTION_RESET
* 10:12152 ERROR_HTTP_INVALID_SERVER_RESPONSE
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
AntonV
Автор

Сообщений: 50
Откуда: Верхняя Пышма
Дата регистрации: 06.01.2014
а куда сам запрос? и DOEVENS пишут надо со скобками

так?
XMLHTTP = createobject("Msxml2.XMLHTTP")
m.T = datetime()
do while !m.OXMLHTTP.READYSTATE=4
doevents()
XMLHTTP.open("GET","https://", .t.)
XMLHTTP.send
=SLEEP(100)
if datetime()-m.T>200
exit
endif
enddo
if !(XMLHTTP.STATUSTEXT = "OK")
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
scan
XMLHTTP = CREATEOBJECT("Msxml2.XMLHTTP")
XMLHTTP.Open("GET","https://"..., .T.)
XMLHTTP.send && послали
m.t = DATETIME() && ожидаем с этого времени T, 20 сек
Do While !XMLHTTP.readyState=4 && 0/1/2/3/4 - до Open / после .Open / отправлен (Запрос был передан) / Ответ сервера принят частично / Complete-соединение закрыто (используется только 4...)
IF DATETIME()-m.t>20 && по достижении таймаута - сбросим
EXIT
ENDIF
ENDDO
* дождались ответа, или таймаута
if XMLHTTP.readyState=4 .AND. INLIST(XMLHTTP.status,200,400) .AND. XMLHTTP.statustext = "OK"
ADOStream = CreateObject("ADODB.Stream")
ADOStream.type = 1
ADOStream.Open
ADOStream.Write(XMLHTTP.responseBody)
ADOStream.SaveToFile(LCLOCALFILE, 2)
ADOStream.Close
ADOStream = NULL
else
? 'Не удалось загрузить файл с сайта !'
? XMLHTTP.statustext
endif
XMLHTTP = NULL
dele file (LCLOCALFILE)
endscan

Кстати, зачем ADOStream = CreateObject("ADODB.Stream") ?
В фоксе есть работа с файлами, FCREATE, FOPEN, STRTOFILE ...
Ratings: 0 negative/2 positive
Re: Зависают удаленные запросы
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AntonV
а куда сам запрос?
Выше - с указанием асинхронности работы. ДО начала цикла.

AntonV
и DOEVENS пишут надо со скобками
Кто пишет? Глупости это. Открой хелп и убедись сам. Это команда а не функция, и там даже явно написано что её нельзя писать с использованием скобок
AntonV
так?
Нет, конечно. Вдумчиво перечитай что Олег написал (благо он уже и полный пример сделал). Пойми логику такого варианта использования асинхронного запроса...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Зависают удаленные запросы
AntonV
Автор

Сообщений: 50
Откуда: Верхняя Пышма
Дата регистрации: 06.01.2014
Да, получается не ждется бесконечно ответ, а по факту - есть ответ, хорошо, нет - ждем 20 секунд и следующий запрос. Запустил цикл, пока не виснет. Спасибо, что подсказали.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 (Гостей: 24)

© 2000-2024 Fox Club 
Яндекс.Метрика