Проблема при запуске веб-службы с использованием пакетного задания?
Я использовал веб-сервис с использованием Visual Studio и использовал управляемый код для вызова этого в AX 2012. Теперь, если я запускаю код в простой работе, как:
static void CurrencyService(Args _args)
{
CurrencyConvert.Currency_Convert.CurrencyServiceClient convertcurrency;
CurrencyConvert.Currency_Convert.Currency currency;
System.ServiceModel.Description.ServiceEndpoint endPoint;
System.Type type;
System.Exception ex;
str s1;
try
{
type = CLRInterop::getType('CurrencyConvert.Currency_Convert.CurrencyServiceClient');
convertcurrency = AifUtil::createServiceClient(type);
endPoint = convertcurrency.get_Endpoint();
// endPoint.set_Address(new System.ServiceModel.EndpointAddress("http://localhost/HelloWorld"));
currency = convertcurrency.GetConversionRate(CurrencyConvert.Currency_Convert.CurrencyCode::AUD,CurrencyConvert.Currency_Convert.CurrencyCode::INR );
info(strFmt('%1', CLRInterop::getAnyTypeForObject(currency.get_Rate())));
}
catch(Exception::CLRError)
{
ex = CLRInterop::getLastException();
info(CLRInterop::getAnyTypeForObject(ex.ToString()));
}
}
Над работой хорошо работает и дает результаты в infolog.
Теперь, если для класса batchjob (расширяющего класс Runbasebatch) написан тот же фрагмент кода, что мы обычно делаем для любого пакетного задания, он выдает ошибку как:
Microsoft.Dynamics.Ax.Xpp.ErrorException: было сгенерировано исключение типа "Microsoft.Dynamics.Ax.Xpp.ErrorException".
в Dynamics.Ax.Application.BatchRun.runJobStatic(Int64 batchId) в BatchRun.runJobStatic.xpp: строка 38
в BatchRun::runJobStatic(Object[])
в Microsoft.Dynamics.Ax.Xpp.ReflectionCallHelper.MakeStaticCall(тип Type, String MethodName, Object[] параметры)
в BatchIL.taskThreadEntry(Объект threadArg)
Другие пакетные задания, кроме тех, которые используются правильно, работают. Я уже пробовал много вещей, таких как: свойство RunOn класса установлено как "сервер" и т. Д. Это имеет место с каждым веб-сервисом, который мы использовали. У кого-нибудь есть правильное решение для этого?
3 ответа
Я предполагаю, что это то же самое, что и на сайте сообщества Dynamics Axe. Таким образом, читая там, ошибка связана не с пакетом, а со следующим: "Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт" Currency_Convert.ICurrencyService "в разделе конфигурации клиента ServiceModel.
Это связано с тем, что выполняется поиск конечной точки в файле AX32.exe.config, а это не та программа, которая вам нужна. Вы должны получить его из файла конфигурации, связанного с вашей DLL.
Для этого вам нужно по-другому сконструировать своего клиента в AX. Вам нужно использовать утилиту AIF, потому что таким образом используется правильный конфиг. Пример:
type= CLRInterop::getType('DynamicsAxServices.WebServices.ZipCode.USAZipCodeServiceRef.PostalCodeServiceClient');
postalServiceClient = AifUtil::createServiceClient(type);
Кроме того, есть еще кое-что для чего. В отдельных средах потребуются разные URL-адреса, и это можно решить, указав адрес конечной точки вручную и разрешив использовать системный параметр. (таким образом, вы можете указать различные конфигурации для DEV/TEST/PROD) (Примечание: ниже адрес конечной точки жестко задан, и это должно быть параметром)
static void Consume_GetZipCodePlaceNameWithEndPoint(Args _args)
{
DynamicsAxServices.WebServices.ZipCode.USAZipCodeServiceRef.PostalCodeServiceClient postalServiceClient;
DynamicsAxServices.WebServices.ZipCode.USAZipCodeServiceRef.PostalCodepostalCode;
System.ServiceModel.Description.ServiceEndpointendPoint;
System.ServiceModel.EndpointAddressendPointAddress;
System.Exceptionexception;
System.Typetype;
;
try
{
// Get the .NET type of the client proxy
type = CLRInterop::getType('DynamicsAxServices.WebServices.ZipCode.USAZipCodeServiceRef.PostalCodeServiceClient');
// Let AifUtil create the proxy client because it uses the VSAssemblies path for the config file
postalServiceClient = AifUtil::createServiceClient(type);
// Create and endpoint address, This should be a parameter stored in the system
endPointAddress = new System.ServiceModel.EndpointAddress ("http://www.restfulwebservices.net/wcf/USAZipCodeService.svc");
// Get the WCF endpoint
endPoint = postalServiceClient.get_Endpoint();
// Set the endpoint address.
endPoint.set_Address(endPointAddress);
// Use the zipcode to find a place name
postalCode = postalServiceClient. GetPostCodeDetailByPostCode("10001"); // 10001 is New York
// Use the getAnyTypeForObject to marshal the System.String to an Ax anyType
// so that it can be used with info()
info(strFmt('%1', CLRInterop::getAnyTypeForObject(postalCode.get_ PlaceName())));
}
catch(Exception::CLRError)
{
// Get the .NET Type Exception
exception = CLRInterop::getLastException();
// Go through the inner exceptions
while(exception)
{
// Print the exception to the infolog
info(CLRInterop::getAnyTypeForObject(exception.ToString()));
// Get the inner exception for more details
exception = exception.get_InnerException();
}
}
}
Я получал ту же проблему, наконец, ее решили. Войдите в систему AOS с учетной записью службы AOS и проверьте, можете ли вы просматривать Интернет. Если нет, то вам нужно установить прокси для интернета в IE. Таким образом, в основном под учетной записью AOS, процесс не может подключиться к поставщику Webservice.
Я решил эту проблему. Я просто заканчиваю сеанс работы всех пользователей онлайн и останавливаю / запускаю AOS после выполнения команды. Может быть, удаление файлов XPPIL и Appl поможет до запуска службы AOS.