17.09.2008, 05:41 | #1 |
Участник
|
Как установить таймаут при получении информации по http
Здаруствуйте уважаемый All
Такая проблема Нужно получать данные по http пример джоба X++: static void testWeight(Args _args) { COM objXHTTP; str s; str _url = "http://cbr.ru"; //Для примера рабочий // str _url = "http://192.168.7.77"; //Нет http пингуется // str _url = "http://192.168.15.200/GetWeight"; //Не пингуется ; objXHTTP = new COM("MSXML2.XMLHTTP"); objXHTTP.Open("GET", _url, false);//true асинхронный objXHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");//отключаем кэш это важно objXHTTP.send(); If(objXHTTP.readyState() == 3 || objXHTTP.readyState() == 4) //4 - Complete; 3 - Some data has been received. { info('ok'); } else { error("Сервер недоступен"); } s = objXHTTP.responseText(); info(s); } пауза происходит при срабатывании objXHTTP.send(); можно изменить код использовать асинхронный доступ X++: objXHTTP.Open("GET", _url, true);//true асинхронный objXHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");//отключаем кэш это важно objXHTTP.send(); sleep(1000);//задержка для получения данных Хотя JScript работает Код: var _url = "http://cbr.ru"; //var _url = "http://192.168.15.53/getweight"; //для проверки недоступности var objXHTTP = new ActiveXObject("Msxml2.XMLHTTP"); objXHTTP.Open("GET", _url, true); objXHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); objXHTTP.send(null); WScript.Sleep(1000); if (objXHTTP.readyState == 3 || objXHTTP.readyState == 4) { WScript.Echo("Done"); } else { WScript.Echo("Server Недоступен " + objXHTTP.readyState); } s = objXHTTP.responseText; WScript.Echo(s); ЗЫ Изменение в реестре параметров KeepAliveTimeout и ServerInfoTimeout ничего не дало
__________________
Нет ничего сложного есть простое и неправильное Последний раз редактировалось jasper; 17.09.2008 в 06:31. |
|
17.09.2008, 09:27 | #2 |
Участник
|
Проблема в sleep(1000). Не знаю в чем причина, но мне не удалось заставить такой код работать в Ax. Сделал таймер на форме через setTimeOut в котором проверяю значение readystate. Так все работает.
|
|
17.09.2008, 10:38 | #3 |
Участник
|
Такой код, без sleep тоже не работает
X++: t = timeNow(); while(timeNow() - t <= 60) { if(objXHTTP.readyState() != 1) { info('1'); break; } } Что то в этом неправильное.
__________________
Нет ничего сложного есть простое и неправильное |
|
17.09.2008, 10:50 | #4 |
Участник
|
А где вызывается send()? Нужно чтобы readystate проверялся не в цикле, а в отдельном потоке, не в том в котором вызван send. В аксапте такое можно реализовать через setTimeOut
Последний раз редактировалось Lucky13; 17.09.2008 в 10:55. |
|
18.09.2008, 02:35 | #5 |
Участник
|
Спасибо за помощь.
непонятно почему работает только в отдельном потоке но это можно использовать.
__________________
Нет ничего сложного есть простое и неправильное |
|