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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.02.2012, 15:14   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
1. Устанавливать что-либо автоматически - категорически не рекомендуется. У пользователя банально может не быть прав на эту операцию. Кроме того, как правило, подобные установки требуют перезагрузку операционной системы.

2. Как следствие, не надо здесь "мудрить". Произошла ошибка - просто прекращайте обработку. Далее пользователь должен Вам выслать снимок экрана с текстом ошибки или Вы ее записываете где-то себе в лог ошибок и ВРУЧНУЮ разбираетесь как с причиной, так и ищите пути исправления.

Это не тот случай, где нужно что-то автоматизировать. Время и силы, потраченные на подобную автоматизацию никогда не окупяться. Слишком много всего надо будет проверять. Например, может быть еще вылет по timeOut. Может быть не корректно указан логин/пароль. Да мало ли что еще...

Насчет обязательной установки драйвера мы у себя решили эту проблему следующим образом. Драйвер ставится на тот компьютер, где крутится AOS. Установка соединения и запросы выполняются на стороне сервера (RunOn = Server). Как следствие, нет необходимости ставить драйвера на клиентские машины.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: CHESER85 (1).
Старый 24.02.2012, 21:42   #2  
ice321i is offline
ice321i
Участник
 
63 / 54 (2) ++++
Регистрация: 22.10.2007
Если 4 то можно и через .NET.

X++:
#define.Port(    );
#define.Server('сервер на котором запущена служба');
System.Net.Sockets.TcpClient tcpClient;
;
tcpClient = new System.Net.Sockets.TcpClient();
tcpClient.Connect(#Server, #Port);
if(!tcpClient.Connected)
throw error("Сервер не доступен");
И не надо ни каких библиотек с собой тянуть)))

Последний раз редактировалось ice321i; 24.02.2012 в 21:56.
Старый 27.02.2012, 06:53   #3  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
1. Устанавливать что-либо автоматически - категорически не рекомендуется. У пользователя банально может не быть прав на эту операцию. Кроме того, как правило, подобные установки требуют перезагрузку операционной системы.

2. Как следствие, не надо здесь "мудрить". Произошла ошибка - просто прекращайте обработку. Далее пользователь должен Вам выслать снимок экрана с текстом ошибки или Вы ее записываете где-то себе в лог ошибок и ВРУЧНУЮ разбираетесь как с причиной, так и ищите пути исправления.

Это не тот случай, где нужно что-то автоматизировать. Время и силы, потраченные на подобную автоматизацию никогда не окупяться. Слишком много всего надо будет проверять. Например, может быть еще вылет по timeOut. Может быть не корректно указан логин/пароль. Да мало ли что еще...

Насчет обязательной установки драйвера мы у себя решили эту проблему следующим образом. Драйвер ставится на тот компьютер, где крутится AOS. Установка соединения и запросы выполняются на стороне сервера (RunOn = Server). Как следствие, нет необходимости ставить драйвера на клиентские машины.
Попробовал воспользоваться вашим советом, но, к сожалению, при установке RunOn=Server все равно запросы происходят на клиенте сам не знаю почему
Старый 27.02.2012, 12:03   #4  
ice321i is offline
ice321i
Участник
 
63 / 54 (2) ++++
Регистрация: 22.10.2007
Вот рабочий пример проверки соединения по определенному порту сервера, проверял на 5, должно работать и для 4:
X++:
static void ConnectToServer(Args _args)
{
    System.Net.Sockets.TcpClient tcpClient;
    ;

    tcpClient = new System.Net.Sockets.TcpClient();
    
    try
    {
        tcpClient.Connect('www.yandex.ru', 80);

        if(tcpClient.get_Connected())
        {
            info("Сервер доступен");
            tcpClient.Close();
        }
    }
    catch(Exception::CLRError)
    {
        error("Ошибка при подключении к серверу");
    }
}
За это сообщение автора поблагодарили: CHESER85 (1).
Старый 10.07.2013, 17:59   #5  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от ice321i Посмотреть сообщение
Вот рабочий пример проверки соединения по определенному порту сервера, проверял на 5, должно работать и для 4:
X++:
static void ConnectToServer(Args _args)
{
    System.Net.Sockets.TcpClient tcpClient;
    ;

    tcpClient = new System.Net.Sockets.TcpClient();
...
}

В том-то и дело, что для 4-ки работает хреново
Иногда вылетает с эксепшеном, иногда без эксепшена - просто не доходит до конца кода.
И еще, помимо вылетов, важный недостаток - нельзя настроить таймаут, который определяет, сколько надо ждать ответа от удаленного сервера, перед тем как посчитать его недоступным.
Я нашел в сети простую утилитку, которая работает для серверов как внутри сети (за фаерволлом), так и вне ее. Работает примитивно, но зато надежно.
Использую прежде всего для определения доступности удаленного (связанного) SQL-сервера, по порту 1433.
Таймаут определен в три секунды, можно поставить и меньше.
Утилитку надо положить в каталог Include приложения.

X++:
#define.PingSuccess('1 successful, 0 failed')
#define.PingFailed('0 successful, 1 failed')
#WInAPI
static server boolean ping3(ServerName _ServerName, str 10 _port = '80')
{
    boolean res, xSuccess, xFailed;

//  одна секунда ожидания
    str templateStr = '-4 -n 1 -w 1 %1 %2 > %3';
    str paramStr, outputStr, commandStr;
    fileName xTCPingEXE;
    fileName xFileName, xDir;
    TextBuffer TextBuffer = new TextBuffer();
    Counter i;

    ;
    xDir = WinAPIServer::getTCPing(true);

    xTCPingEXE = WinAPIServer::getTCPing(false);
    xFileName = xDir + curUserId() + '_ping.txt';
    paramStr = strFmt(templateStr, _ServerName, _port, xFileName);
    commandStr = 'CMD /c ' + xTCPingEXE + ' ' + paramStr;

//  три секунды ожидания
    WinAPI_R::shellExecuteWait(commandStr, 3000);
    TextBuffer.fromFile(xFileName);
    outputStr = TextBuffer.getText();
    xSuccess = strscan(outputStr, #PingSuccess, 1, strlen(outputStr)) ? true : false;
    xFailed = strscan(outputStr, #PingFailed, 1, strlen(outputStr)) ? true : false;
    if (xSuccess == xFailed)
    {
        throw error("Непонятный результат пинга!");
    }

    WinAPIServer::deleteFile(xFileName);
    return xSuccess;
}
Метод, возвращающий (серверный) путь к экзешнику tcping.exe:
X++:
static server fileName getTCPing(boolean _directoryOnly = false)
{
    filename xdir, xfile;

    ;

    xdir = xInfo::directory(DirectoryType::Include) + @'TCPing\';
    xfile = xInfo::directory(DirectoryType::Include) + @'TCPing\tcping.exe';
    if (!WinAPIServer::fileExists(xfile))
    {
        throw info(strFmt('   %1', xfile));
    }
    return _directoryOnly ? xdir : xfile;
}
метод shellExecuteWait() взят отсюда.
__________________
Бесты и регарды!
Старый 27.02.2012, 20:21   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от CHESER85 Посмотреть сообщение
Попробовал воспользоваться вашим советом, но, к сожалению, при установке RunOn=Server все равно запросы происходят на клиенте сам не знаю почему
Еще раз напомню, что установка соединения и выполнения запроса происходит в классах CCADO... (CCADOConnection, CCADOCommand, CCADOFields, CCADOField, CCADORecordSet) Другими словами, надо смотреть свойство RunOn у этих классов.

В младших версиях Axapta у них это свойство было "Called From". Т.е. откуда вызвали, там и работают. Но вот в Ax2009 уже стоит Client. Посмотрите, что стоит в Вашей версии.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 28.02.2012, 06:21   #7  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Еще раз напомню, что установка соединения и выполнения запроса происходит в классах CCADO... (CCADOConnection, CCADOCommand, CCADOFields, CCADOField, CCADORecordSet) Другими словами, надо смотреть свойство RunOn у этих классов.

В младших версиях Axapta у них это свойство было "Called From". Т.е. откуда вызвали, там и работают. Но вот в Ax2009 уже стоит Client. Посмотрите, что стоит в Вашей версии.
Поменял у классов CCADO* значение RunOn на Server, и вот что выдало при запуске:
Сбой запроса на разрешение типа "InteropPermission".
(S)\Classes\InteropPermission\demand
(S)\Classes\COM\new
(S)\Classes\CCADOConnection\new - line 4
(C)\Jobs\GidInOutReport - line 20

Error Сообщение (08:18:21) Объект "COM" не может быть создан
Теги
firebird, ping

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Метод "open" в COM-объекте класса "ADODB.Connection" возвратил код ошибки 0x80004005 (E_FAIL) Poleax DAX: Программирование 14 01.10.2013 14:15
Как программно узнать текущий объект и метод в котором выполняется код? McCoy DAX: Программирование 15 25.02.2011 23:34
Dundas.mailer-код ошибки 0x80020009 donMigel DAX: Прочие вопросы 4 06.10.2010 10:28
Метод "SendMail" в COM-объекте класса "Dundas.mailer" возвратил код ошибки 0x80004005 (E_FAIL), который означает: The RCPT command failed. The specified account does not exist. Андрей К. DAX: Программирование 3 10.07.2009 16:08
Метод 'SendMail' в COM-объекте класса 'Dundas.mailer' возвратил код ошибки 0x80004005 (E_FAIL), который означает: The HELLO command failed. Andrew Akhmetov DAX: Программирование 4 09.04.2008 13:24

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

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

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