AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.09.2008, 05:41   #1  
jasper is offline
jasper
Участник
 
13 / 11 (1) +
Регистрация: 22.10.2004
Адрес: Владивосток
Как установить таймаут при получении информации по 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);//задержка для получения данных
Но этот код не работает: не меняется readyState, при вызове responseText происходит ошибка
Хотя 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);
Проверка состояния objXHTTP.readyState в цикле в ax тоже ничего не дает, состояние остается равным 1
ЗЫ Изменение в реестре параметров KeepAliveTimeout и ServerInfoTimeout ничего не дало
__________________
Нет ничего сложного есть простое и неправильное

Последний раз редактировалось jasper; 17.09.2008 в 06:31.
Старый 17.09.2008, 09:27   #2  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от jasper Посмотреть сообщение
Но этот код не работает: не меняется readyState, при вызове responseText происходит ошибка
Проблема в sleep(1000). Не знаю в чем причина, но мне не удалось заставить такой код работать в Ax. Сделал таймер на форме через setTimeOut в котором проверяю значение readystate. Так все работает.
Старый 17.09.2008, 10:38   #3  
jasper is offline
jasper
Участник
 
13 / 11 (1) +
Регистрация: 22.10.2004
Адрес: Владивосток
!
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Проблема в sleep(1000).
Такой код, без sleep тоже не работает
X++:
t = timeNow();
    while(timeNow() - t <= 60)
    {
        if(objXHTTP.readyState() != 1)
        {
            info('1');
            break;
        }
    }
Таймер работает.
Что то в этом неправильное.
__________________
Нет ничего сложного есть простое и неправильное
Старый 17.09.2008, 10:50   #4  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от jasper Посмотреть сообщение
Такой код, без sleep тоже не работает
X++:
t = timeNow();
    while(timeNow() - t <= 60)
    {
        if(objXHTTP.readyState() != 1)
        {
            info('1');
            break;
        }
    }
Таймер работает.
Что то в этом неправильное.
А где вызывается send()? Нужно чтобы readystate проверялся не в цикле, а в отдельном потоке, не в том в котором вызван send. В аксапте такое можно реализовать через setTimeOut

Последний раз редактировалось Lucky13; 17.09.2008 в 10:55.
Старый 18.09.2008, 02:35   #5  
jasper is offline
jasper
Участник
 
13 / 11 (1) +
Регистрация: 22.10.2004
Адрес: Владивосток
Спасибо за помощь.
непонятно почему работает только в отдельном потоке но это можно использовать.
__________________
Нет ничего сложного есть простое и неправильное
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно-ли установить уровень изоляции транзакции ? egorych DAX: Программирование 12 14.09.2007 14:17
Установить курсор на форме Eldar9x DAX: Программирование 2 19.04.2007 14:18
Как по имени(ID) поля таблицы установить значение поля. AKit_3 DAX: Программирование 9 24.12.2004 19:03
Почему Аксапта пытается установить Microsoft Office и как это обойти. AOS DAX: Администрирование 12 24.10.2003 10:39
Установить время файла? SnowMan DAX: Программирование 5 01.10.2003 14:42

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:05.