我们在AX环境中添加了一个C#项目。我们最近对app.config文件进行了修改,清理并重建了项目,并将其部署到AOT。如果我进入SqlServer Management Studio并查询VSASSEMBLIES表,我可以看到相应的.dll和.dll.config文件。我转储.dll.config的内容并将其转换回文本以确保表中的版本是最新的,并且它是。
问题是当AOS重新启动时,.dll.config文件永远不会写入磁盘(C:\ Program Files \ Microsoft Dynamics AX \ 60 \ Server [Instance] \ bin \ VSAssemblies)。 .dll写出来了,但不是配置。如果我清除整个目录并重新启动AOS,除了我们的配置文件外,所有内容都会被写回来。
EInvoiceCFDI_MX.dll的配置文件被写出来,所以我已经搜索了他们的项目文件和配置,并且无法提供我们没有设置的任何内容。
我唯一看到的是在AOT中,EInvoiceCFDI_MX项目显示了Project Output下的.dll.config文件,而我们没有。我检查了默认构建脚本引用的中间目标,它清楚地表明app.config应该被复制到项目输出中,但由于某种原因它不是。
我错过了什么?
Jan,谢谢你的帖子。
我们正在以您引用的方式构建/配置服务:
CLRObject clientType = CLRInterop::getType("OurService");
OurService client = AifUtil::createServiceClient(clientType);
createServiceClient()抛出异常:
System.Reflection.TargetInvocationException: Exception has been thrown by the
target of an invocation. ---> System.InvalidOperationException: Unable to find
the application configuaration file C:\Users\<user>\AppData\Local\Microsoft\
Dynamics Ax\VSAssemblies\OurService.dll.config.
OurService.dll.config文件位于AOT中,但是当服务器或客户端启动时,它不会写入磁盘。
答案 0 :(得分:2)
在Visual Studio项目中,转到app.config
文件的属性并设置以下属性:
(不确定属性的翻译是否正确,因为我有德语版本......)
答案 1 :(得分:1)
您是否更改了全局app.config?不要!
而是使用AifUtil::CreateServiceClient
as explained here使项目配置文件可用。
更改配置文件?这可行,但是类库 配置文件存储在模型存储中并由下载 客户端服务器。它不能改变,除非在AOT中改变了 重建Visual Studio项目,此时客户端/服务器 将从模型商店下载新版本。所以,你可以 将所有app.config设置复制/粘贴到AX32(serv).exe.config中 文件并在那里更改。那你就不需要用了 aifUtil :: createserviceclient。无论如何,这是非常不切实际的, 特别是对于在客户端运行的服务!
来自Technet article: 以下示例代码显示如何为Bing服务构造和配置服务客户端对象。要使用Web服务,必须在Microsoft Dynamics AX程序中使用此代码以启用服务引用以构造和配置服务客户端的实例。
// Retrieve the X++ type for the Bing service client object.
ClrObject clientType = CLRInterop::getType("BingSearch.ServiceReferences.BingV2ServiceReference.BingPortTypeClient");
// Use the AifUtil class to create an instance of the service client object.
BingSearch.ServiceReferences.BingV2ServiceReference.BingPortTypeClient client = AifUtil::CreateServiceClient(clientType);
答案 2 :(得分:1)
配置文件中包含哪些更改?
如果是您要修改的地址,您还可以根据存储在Ax环境中的参数来消除配置文件的需要并自行配置绑定。
例如,当您创建外部服务并且想要从Ax调用它时,但DEV / TST / PRODUCTION具有不同的URL。您可以在创建客户端时指定这一点,而不是在配置文件中添加地址和绑定信息。
下面是一段代码,它手动改变EndPoint并输入我们想要的值。 (您可以将值放在参数中,以便您可以根据环境进行设置。
static void Consume_GetZipCodePlaceNameWithEndPoint(Args _args)
{
DynamicsAxServices.WebServices.ZipCode.USAZipCodeServiceRef.PostalCodeServiceClient postalServiceClient;
DynamicsAxServices.WebServices.ZipCode.USAZipCodeServiceRef.PostalCodepostalCode;
System.ServiceModel.Description.ServiceEndpoint endPoint;
System.ServiceModel.EndpointAddress endPointAddress;
System.Exception exception;
System.Type type;
;
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();
}
}
}