AX2012提供三种系统服务:Metadata service、Query service和User session service,它们都是随AOS安装自带的,宿主在AOS上,只能使用netTcpBinding端口绑定方式。这里讲讲Metadata service的使用,通过Metadata service,可以得到创建在AOT中元素的信息,比如表的字段信息、查询的Datasource信息等等,完整的元数据服务可用操作可用在这里查询:。
在.net工程中使用元数据服务很简单,首先需要添加元数据服务的Service引用,WSDL的URL为: http://servername:8101/DynamicsAx/Services/MetadataService。下面是一个获取AOT中Service节点信息的一个例子:
static void Main(string[] args) { AxMetadataServiceClient client = new AxMetadataServiceClient(); try { // Gets the names of all services in a string array. string[] services = client.GetServiceNames(); // Loops through all the service names and prints them to the console. foreach (string serviceName in services) { Console.WriteLine("Service named: {0}", serviceName); } // Gets the name of the first service. string[] serviceNames = new string[1]; serviceNames[0] = services[0]; // Gets the metadata for the first service. ServiceMetadata[] serviceMetadata = client.GetServiceMetadataByName(serviceNames); client.Close(); } catch { client.Abort(); throw; } }
在第二个例子中演示如何得到AOT Query的Datasource名称:
using System;using MetadataServiceTest.MetadataServiceReference;namespace MetadataServiceTest{ class Program { static void Main(string[] args) { AxMetadataServiceClient client = new AxMetadataServiceClient(); try { // Gets the names of all queries in a string array. string[] queries = client.GetQueryNames(); // Loops through all the query names. foreach (string queryName in queries) { if (queryName == "AxdSalesOrder") { // Stores the name of the AxdSalesOrder query. string[] limitedNames = new string[1]; limitedNames[0] = queryName; // Writes the name of the query to the console. Console.WriteLine("Query named: {0}", queryName); // Gets the metadata for the AxdSalesOrder query. QueryMetadata[] queryMetadata = client.GetQueryMetadataByName(limitedNames); // Creates a query metadata object. QueryMetadata querySalesOrder = queryMetadata[0]; // Loops through thequery data sources and writes them to the console. foreach (QueryDataSourceMetadata queryDS in querySalesOrder.DataSources) { RecursivelyIterateDataSources(queryDS); } Console.ReadKey(true); } } client.Close(); } catch { client.Abort(); throw; } } static void RecursivelyIterateDataSources(QueryDataSourceMetadata parent) { Console.WriteLine("Query data source named: {0}", parent.Name.ToString()); // Loops through the query data sources and writes them to the console. foreach (QueryDataSourceMetadata queryDS in parent.DataSources) { RecursivelyIterateDataSources(queryDS); } } }}
在第三个例子中演示如何得到表字段的信息:
using System;using MetadataSvcGetFieldLabels.MetadataServiceReference;namespace MetadataSvcGetFieldLabels{ class Program { static void Main(string[] args) { AxMetadataServiceClient client = new AxMetadataServiceClient(); try { // The table ID of the SalesTable. int[] tableIDs = new int[1]; tableIDs[0] = 366; // Gets the table metadata. TableMetadata[] tableMetadata = client.GetTableMetadataById(tableIDs); TableMetadata salesTable = tableMetadata[0]; foreach (DataFieldMetadata fieldMetadata in salesTable.Fields) { // Print the field name and the label for the field to the console. System.Console.WriteLine("Field named: {0}, Field label: {1}", fieldMetadata.Name, client.GetLabelMetadataForLanguageById("EN-US", new string[] { fieldMetadata.LabelId })[0].LabelString); } Console.ReadKey(true); client.Close(); } catch { client.Abort(); throw; } } } }
使用元数据服务的用户必须是有效的AX用户,所有通过认证的AX用户都可以访问元数据服务,并且所有安全角色看到的元数据信息都是一样的。