2

我已经使用 Visual Studio 使用了一个 Web 服务,并使用托管代码在 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()));
}
}

上述工作工作正常,并在信息日志中产生结果。

现在,如果在批处理作业(扩展 Runbasebatch 类)的类下编写相同的代码,就像我们通常为任何批处理作业所做的那样,它会抛出错误:

Microsoft.Dynamics.Ax.Xpp.ErrorException:引发了“Microsoft.Dynamics.Ax.Xpp.ErrorException”类型的异常。

在 BatchRun.runJobStatic.xpp:line 38 中的 Dynamics.Ax.Application.BatchRun.runJobStatic(Int64 batchId)

在 BatchRun::runJobStatic(Object[])

在 Microsoft.Dynamics.Ax.Xpp.ReflectionCallHelper.MakeStaticCall(类型类型,字符串 MethodName,Object[] 参数)

在 BatchIL.taskThreadEntry(对象 threadArg)

除了使用的 Web 服务之外的其他批处理作业正常工作。我已经尝试过很多事情,例如:类的 RunOn 属性设置为“服务器”等。我们使用的每个 Web 服务都是这种情况。有人对此有适当的解决方案吗?

4

3 回答 3

1

我假设这与 Dynamics Ax 社区网站上的帖子相同。所以读到那里,错误与批处理无关,而是与以下内容有关:“在 ServiceModel 客户端配置部分中找不到引用合同‘Currency_Convert.ICurrencyService’的默认端点元素。

这是因为端点正在 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();    
        }
    }
}
于 2014-01-02T19:55:00.293 回答
1

我遇到了同样的问题,终于解决了。使用 AOS 服务帐户登录 AOS 机器,并检查您是否可以浏览互联网。如果没有,则需要在 IE 中设置 Internet 代理。所以基本上在AOS帐户下,进程无法连接到Webservice provider。

于 2016-04-18T03:42:42.923 回答
1

我已经解决了这个问题。我只是在完成 ful cil 后结束所有在线用户的会话并停止/启动 AOS。在启动 AOS 服务之前,删除 XPPIL 和 Appl 文件可能会有所帮助。

于 2017-07-25T06:17:57.537 回答