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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.06.2019, 18:02   #1  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
AX2009 References сервиса из AX2012
Прошу помочь.

Создал сервис в AX2012 согласно этой инструкции. После чего добавил в AX2009 ссылку на службу.

Создаю джоб и пытаюсь получить данные из службы. Но аксапта выдает ошибку:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Не удалось найти файл App.config в местоположении сборки на сервере. Наиболее вероятной причиной этого является код, выполняющийся на уровне клиента. Запустите код на уровне сервера.
at Microsoft.Dynamics.IntegrationFramework.WebService.WebReferenceBase.Init(String webReferenceName, String wcfSoapClientType, String endpointConfiguration)....


вопрос, что я сделал не так или недоделал?
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 26.06.2019, 10:27   #2  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А из какого-либо средства проверки, типа SoapUI и подобных работает? Ну или, если в Visual Studio сделать ссылку на сервис и попробовать через сгенерированный прокси класс достучаться работает?
И, как вариант, вот это:
Цитата:
Создаю джоб...
А если не из джоба, а из серверного класса или серверного статического метода работает?
За это сообщение автора поблагодарили: demianimp (2).
Старый 26.06.2019, 13:39   #3  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Что тестирование показало:
1) Когда добавил другой веб-сервис, то аксапта2009 отработала корректно и без ошибок;
2) Работает только на сервере;
3) Добавил в VS референс на сервис аксапты2012, там все отработало корректно;
4) аксапта2009 отказывается работать с сервисом от аксапта2012.
Нажмите на изображение для увеличения
Название: ax2012ax2009.JPG
Просмотров: 172
Размер:	15.8 Кб
ID:	12341
Показывает доступные методы из сервиса с переменными, но компилятор говорит "Класс Tutorial.Tutorial_LabServiceClient не содержит эту функцию."
5) Но все равно при new не может найти App.config
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 26.06.2019, 14:45   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Показывает доступные методы из сервиса с переменными, но компилятор говорит "Класс Tutorial.Tutorial_LabServiceClient не содержит эту функцию."
А если подсунуть не null, а пустой объект именно с точки зрения NET.
X++:
public static System.Object CLRMissing()
{
    System.Type                 type;
    System.Reflection.FieldInfo infoRef;
    System.Object               missing;
    ;

    type        =  System.Type::GetType("System.Reflection.Missing");
    infoRef     =  type.GetField("Value");
    missing     = inforef.GetValue(Null);

    return missing;
}
Старый 26.06.2019, 15:33   #5  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Все равно говорит, что не содержит этой функции
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 26.06.2019, 15:40   #6  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Нашли решение через

X++:
Tutorial.CallContext    callContext;
serviceData = labService.getCustData(callContext, '1');
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 27.06.2019, 13:46   #7  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Продолжаем попытки подружить AX2009 с AX2012 через сервис.

Что удалось выяснить.
1) При добавлении референса, AX2009 добавляет его по адресу %programFiles%\Microsoft Dynamics AX\50\Application\Appl\%NameApp%\ServiceReferences\%NameService%
2) При работе с %NameService%, почему-то ищет в %programFiles%\Microsoft Dynamics AX\50\Server\%NameAOS%\Bin. Причем это только для сервиса из AX2012.
3) Оказалось, что callContext нужно все таки инициализировать
X++:
callContext = new Tutorial.CallContext()
Вопрос, где производиться настройка, чтобы AX2009 смотрела %programFiles%\Microsoft Dynamics AX\50\Application\Appl\%NameApp%\ServiceReferences\%NameService%, а не %programFiles%\Microsoft Dynamics AX\50\Server\%NameAOS%\Bin?
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 27.06.2019, 16:54   #8  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Разобрались, оказывается если референс назвать MDMExchange, то все работает через одно место, а вот если обозвать ExchangeMDM или NDNExchange, то работает все корректно, как задумано создателями.

Всем спасибо за участие.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
За это сообщение автора поблагодарили: Logger (3), Raven Melancholic (3).
Старый 15.11.2019, 17:55   #9  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
?
Цитата:
Сообщение от demianimp Посмотреть сообщение
Вопрос, где производиться настройка, чтобы AX2009 смотрела %programFiles%\Microsoft Dynamics AX\50\Application\Appl\%NameApp%\ServiceReferences\%NameService%, а не %programFiles%\Microsoft Dynamics AX\50\Server\%NameAOS%\Bin?
Оказалось, что вопрос все еще актуальный.
Есть несколько одинаковых версий серверов. На одних работает, на других нет.
На которых работает смотрит в папку %programFiles%\Microsoft Dynamics AX\50\Application\Appl\%NameApp%\ServiceReferences\%NameService%, а на которых отказывается работать смотрит %programFiles%\Microsoft Dynamics AX\50\Server\%NameAOS%\Bin.

Кто знает, от чего это зависит?
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 16.11.2019, 06:30   #10  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Такое ощущение, что у вас на некоторых АОСах в файле Ax32Serv.exe.config включена поддержка .Net Framework 4.5 или выше.
На этих серверах штатный механизм создания референсов на веб-сервисы использовать нельзя, АОС будет искать файл app.config в каталоге bin.
__________________
Дмитрий
Старый 16.11.2019, 14:32   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А зачем на рабочей это делать?
Можно скопировать папку и импортировать узел аот через xpo. Рестартовать аос.
Должно сработать.
Старый 16.11.2019, 21:28   #12  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Damn Посмотреть сообщение
Такое ощущение, что у вас на некоторых АОСах в файле Ax32Serv.exe.config включена поддержка .Net Framework 4.5 или выше.
На этих серверах штатный механизм создания референсов на веб-сервисы использовать нельзя, АОС будет искать файл app.config в каталоге bin.
А как нестандартным импортировать? Что нужно сделать, чтобы заработало?
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 16.11.2019, 21:30   #13  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Logger Посмотреть сообщение
А зачем на рабочей это делать?
Можно скопировать папку и импортировать узел аот через xpo. Рестартовать аос.
Должно сработать.
Скопировал папку, импортировал узел через XPO (AOS перетер файлы), Рестартовал AOS, все равно ошибка
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.

Последний раз редактировалось demianimp; 16.11.2019 в 21:43.
Старый 16.11.2019, 21:43   #14  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Предлагаю всё-таки определить в этом дело или нет.
Если на АОСе действительно включена поддержка .NET Framework 4.5, то я например у себя заменил штатный механизм генерации референсов на веб-сервисы. Использую утилиты svcutil.exe и csc.exe. Можно взять утилиты от версии 3.5 (для использования на всех АОСах). А можно взять утилиты от версии 4, их можно использовать только на АОСах с поддержкой .NET Framework 4.5.
Утилиты разных версий генерят немного разные прокси-dll. Отличия перечислять не буду, но они есть.
Внешне для разработчика у меня генерация референсов не изменилась. Тот же диалог, те же сообщения, только файл app.config генерится пустой, так как он не используется. Биндинги и endpoint нужно программно создавать при инициализации soapClient.
__________________
Дмитрий
Старый 17.11.2019, 12:32   #15  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от demianimp Посмотреть сообщение
Вопрос, где производиться настройка, чтобы AX2009 смотрела %programFiles%\Microsoft Dynamics AX\50\Application\Appl\%NameApp%\ServiceReferences\%NameService%, а не %programFiles%\Microsoft Dynamics AX\50\Server\%NameAOS%\Bin?
Судя по всему, нигде не задается.
Если посмотреть код Microsoft.Dynamics.IntegrationFramework.WebService.WebReferenceBase.Init, то видно, что указанная ошибка выдается:
X++:
protected void Init(string webReferenceName, string wcfSoapClientType, string endpointConfiguration)
{
	Assembly callingAssembly = Assembly.GetCallingAssembly();
	string directoryName = Path.GetDirectoryName(callingAssembly.Location);
	string path = string.Format(CultureInfo.InvariantCulture, CONFIG_FILE_FORMAT, directoryName);
	if (!File.Exists(path))
	{
		throw new FileNotFoundException(resourceMgr.GetString("Consume_WS_AppConfig_NotFound"));
	}
То есть, что-то разное на разных серверах дает Assembly.GetCallingAssembly().Location
В https://docs.microsoft.com про GetCallingAssembly и Location есть примечания про разницу возвращаемых значений для "расширяется встроенным образом," "теневое копирование" и прочих. Для меня эти термины темный лес, может подскажут что-то те, кто хорошо знает NET.
Старый 17.11.2019, 12:34   #16  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Может быть, в методе генерации исходного кода (AifServiceReferenceManager::generate) и его компиляции поставить точку останова после генерации исходного кода но до компиляции и сборки и скопировать куда-нибудь из временных файлов исходных кодов на "правильном" и "ошибочном" серверах и по коду, возмодно, что-то прояснится?
Старый 18.11.2019, 13:30   #17  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Damn Посмотреть сообщение
Предлагаю всё-таки определить в этом дело или нет.
Если на АОСе действительно включена поддержка .NET Framework 4.5, то я например у себя заменил штатный механизм генерации референсов на веб-сервисы. Использую утилиты svcutil.exe и csc.exe. Можно взять утилиты от версии 3.5 (для использования на всех АОСах). А можно взять утилиты от версии 4, их можно использовать только на АОСах с поддержкой .NET Framework 4.5.
Утилиты разных версий генерят немного разные прокси-dll. Отличия перечислять не буду, но они есть.
Внешне для разработчика у меня генерация референсов не изменилась. Тот же диалог, те же сообщения, только файл app.config генерится пустой, так как он не используется. Биндинги и endpoint нужно программно создавать при инициализации soapClient.
Да, на серверах действительно включен .NET Framework 4.5, но на каких-то работает, а на каких-то нет.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Судя по всему, нигде не задается.
То есть, что-то разное на разных серверах дает Assembly.GetCallingAssembly().Location
X++:
    System.Reflection.Assembly  callingAssembly;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    callingAssembly = System.Reflection.Assembly::GetCallingAssembly();
    info(callingAssembly.get_Location());
На сервере возвращает C:\Program Files\Microsoft Dynamics AX\50\Server\%AosName%\Bin\Microsoft.Dynamics.ClrBridge.dll

Т.е. по идее и сейчас должна возвращаться ошибка.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 18.11.2019, 13:43   #18  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от demianimp Посмотреть сообщение
Да, на серверах действительно включен .NET Framework 4.5, но на каких-то работает, а на каких-то нет.
Работает на тех серверах, на которых не запускался механизм создания или обновления референса.
DLL, сгенерированная на АОСе в режиме поддержки Framework 3.5, корректно работает на любых АОСах.
DLL, сгенерированная на АОСе в режиме поддержки Framework 4.5, не будет работать ни на каком АОСе.

Почему у вас на каких-то серверах включена поддержка Framework 4.5, а на каких-то выключена ? Что вы используете из 4.5 ?
__________________
Дмитрий
Старый 18.11.2019, 13:46   #19  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от demianimp Посмотреть сообщение
На сервере возвращает C:\Program Files\Microsoft Dynamics AX\50\Server\%AosName%\Bin\Microsoft.Dynamics.ClrBridge.dll
Т.е. по идее и сейчас должна возвращаться ошибка.
Не, тут-то как раз все хорошо - Microsoft.Dynamics.ClrBridge.dll действительно находится в ...\bin и при вызове из кода X++ этот ClrBridge является посредником, чья сборка выполняется.
Я имел ввиду, что WebReferenceBase.Init вызывается из прокси WEB сервиса, который находится в Appl...ServiceReferences... и, по хорошему, location должен вернуть его местонахождение, а там же лежит *.config. Но, в каких-тор случаях что-то явно идет не так и Assembly.GetCallingAssembly() почему-то считает, что он выполняется не в контексте прокси, а в контексте какой-то сборки из bin.
А вот почему он так считает, тут уже мне знаний не хватает.
Старый 18.11.2019, 13:53   #20  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Damn Посмотреть сообщение
Работает на тех серверах, на которых не запускался механизм создания или обновления референса.
DLL, сгенерированная на АОСе в режиме поддержки Framework 3.5, корректно работает на любых АОСах.
DLL, сгенерированная на АОСе в режиме поддержки Framework 4.5, не будет работать ни на каком АОСе.

Почему у вас на каких-то серверах включена поддержка Framework 4.5, а на каких-то выключена ? Что вы используете из 4.5 ?
4.5 включен на всех серверах, это и смущает, что на одних работает, а на других нет.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Не, тут-то как раз все хорошо - Microsoft.Dynamics.ClrBridge.dll действительно находится в ...\bin и при вызове из кода X++ этот ClrBridge является посредником, чья сборка выполняется.
Я имел ввиду, что WebReferenceBase.Init вызывается из прокси WEB сервиса, который находится в Appl...ServiceReferences... и, по хорошему, location должен вернуть его местонахождение, а там же лежит *.config. Но, в каких-тор случаях что-то явно идет не так и Assembly.GetCallingAssembly() почему-то считает, что он выполняется не в контексте прокси, а в контексте какой-то сборки из bin.
А вот почему он так считает, тут уже мне знаний не хватает.
X++:
string directoryName = Path.GetDirectoryName(callingAssembly.Location);
Разве не будет возвращать всегда C:\Program Files\Microsoft Dynamics AX\50\Server\%AosName%\Bin\ ? Или что-то не понял
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Теги
ax2009, ax2012, web service

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2012 AIF HTTP WebService и их вызов из AX2009 Dmytro.Semenakha DAX: Программирование 2 29.03.2016 09:38
Перенос и адаптация кода с Ax2009 на Ax2012 R3 matew DAX: Прочие вопросы 10 23.01.2015 19:52
Deploy reports to SRS при одновременно установленной AX2009 и ax2012 mazzy DAX: Администрирование 3 18.12.2012 15:50
emeadaxsupport: AX2012 and AX2009 or AX4 side by side - AOS performance counters overwritten Blog bot DAX Blogs 0 13.03.2012 18:11
Перенос данных из AX2009 в AX2012 trud DAX: Администрирование 3 21.02.2012 12:35
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.