Проблема при запуске веб-службы с использованием пакетного задания?

Я использовал веб-сервис с использованием 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.

Другие вопросы по тегам