[AX]AX2012 AIF(八):系统服务之Metadata service

AX2012提供三种系统服务:Metadata service、Query service和User session service,它们都是随AOS安装自带的,宿主在AOS上,只能使用netTcpBinding端口绑定方式。这里讲讲Metadata service的使用,通过Metadata service,可以得到创建在AOT中元素的信息,比如表的字段信息、查询的Datasource信息等等,完整的元数据服务可用操作可用在这里查询:http://msdn.microsoft.com/EN-US/library/gg845212.aspx

在.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用户都可以访问元数据服务,并且所有安全角色看到的元数据信息都是一样的。

原文地址:https://www.cnblogs.com/duanshuiliu/p/2932092.html