14.02.2017, 09:18 | #1 |
Участник
|
runbuf на сервере
Всем привет.
Есть одна не большая задача. Я нашёл один путь её решения, но возможно такую же задачу кто-то решал и нашёл другой путь. Итак, у нас есть несколько сайтов, возвращающих рублёвый курс валюты: юань - XXX.XXX.XXX.XXX:8081 евро - XXX.XXX.XXX.XXX:8082 доллар - XXX.XXX.XXX.XXX:8083 У каждого сайт есть описанный WSDL с одинаковой функцией getCurrency. Все эти сайты не "наши" и попросить "их" сделать как-то по другому - нельзя. Один раз в сутки, карета превращается в тыкву и меняет свой адрес на YYY.YYY.YYY.YYY и каждый раз этот ip новый. Сама задача - хочется автоматически в серверном режиме менять настройки данных адресов. Для начала создадим описание наших WSDL: Нам присылают текстовый файл, с текущими IP, обходим его в цикле и создаём ServiceReference вот такими строчками: X++: SysReference::createServiceReference('CurrencyU', 'XXX.XXX.XXX.XXX:8081?WSDL', 'CurrencyU', 'юань'); SysReference::createServiceReference('CurrencyE', 'XXX.XXX.XXX.XXX:8082?WSDL', 'CurrencyE', 'евро'); SysReference::createServiceReference('CurrencyD', 'XXX.XXX.XXX.XXX:8083?WSDL', 'CurrencyD', 'доллар'); Теперь мы сможем к ним обратиться таким кодом: X++: CurrencyU.AxCurrencyTypeClient webService = new CurrencyU.AxCurrencyTypeClient("AxCurrencySoap"); currentCurrency = webService.getCurrency(); X++: string command = '%1 webService = %1("AxCurrencySoap");'; currentCurrency = webService.getCurrency(); runBuf(command, 'CurrencyU.AxCurrencyTypeClient'); В результате написал код, который в X++ изменяет метод возврата объектов, т.е. есть класс Currency, и у него есть метод getReference, который генерируется автоматически, по приблизительно следующему коду: X++: classBuild = new ClassBuild(classStr(Currency), true); getServiceReference = '// Внимание! Данный метод генерируется автоматически Currency::buildReferences()' + '\n' + 'public static server object getServiceReference(str _referenceName)' + '\n' + '{' + '\n' + ' Object object;' + '\n' + ' ;' + '\n'; while select currencies { getServiceReference += ' case "' + currencies.ServiceReferenceName +'" :' + '\n' + ' object = new ' + currencies.ServiceReferenceName + '.AxCurrencyPortTypeClient("AxCurrencySoap");' + '\n' + ' break;' + '\n'; } getServiceReference += ' }' + '\n'; } getServiceReference += ' return object;' + '\n' + '}'; classBuild.overrideMethod('getServiceReference', getServiceReference); P.S. Это только общий смысл и код приведён лишь частично. Последний раз редактировалось Avalon; 14.02.2017 в 09:26. |
|