Walkthrough: Calling the Metadata Service
Important
This content is archived and is not being updated. For the latest documentation, see Microsoft Dynamics 365 product documentation. For the latest release plans, see Dynamics 365 and Microsoft Power Platform release plans.
Applies To: Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Feature Pack, Microsoft Dynamics AX 2012
The metadata service is one of the system services exposed by Microsoft Dynamics AX and that adheres to the Windows Communication Foundation (WCF) protocols and standards. This service enables you to retrieve information about AOT objects such as tables, services, extended data types (EDTs), enums, and so on. In this walkthrough, you will call the metadata service from a C# program and return metadata for a specific query.
This walkthrough illustrates the following tasks:
Add a reference to the metadata service.
Call the service and retrieve the metadata.
Prerequisites
To complete this walkthrough you will need:
Microsoft Dynamics AX 2012
Visual Studio 2010
Add a Reference to the Metadata Service
In order to call the metadata service, you must first create a project in Visual Studio and add a reference to the service.
To add a reference to the metadata service
Open Visual Studio and create a new project by selecting File > New > Project.
In the Installed Templates tree, select Visual C# > Windows and click the Console Application template.
Type a project name such as MetadataServiceTest and click OK.
In Solution Explorer, right-click References and select Add Service Reference.
In the Address Field, enter the URL of the service. For example, http://servername:8101/DynamicsAx/Services/MetadataService.
Click Go. In the Services tree, you should see the AxMetadataService.
In the Namespace field, type MetadataServiceReference and click OK.
Call the Service and Retrieve the Metadata
Now we will write the code that calls the metadata service and returns the metadata for a single query.
To call the metadata service
In the Program.cs file, add the following using statements.
using System; using MetadataServiceTest.MetadataServiceReference;
In the Program.cs Main method, add the code to call the service. The contents of the Program.cs file should look as follows:
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); } } } }
Run the program. The program writes the name of the AxdSalesOrder query and the names of the query data sources to the console window. The output looks like the following:
Query named: AxdSalesOrder Query data source named: SalesTable Query data source named: TableDlvAddr Query data source named: TableCarrierAddr Query data source named: SalesLine Query data source named: LineDlvAddr Query data source named: LineCarrierAddr Query data source named: InventDim Query data source named: DocuRefLine Query data source named: MarkupTransLine Query data source named: DocuRefHeader Query data source named: MarkupTransHeader Query data source named: CreditCardAuthTrans
Tip
If you run the code and receive a message size exception, you may need to modify settings in the app.config file on the server and client. For more information, see Message Size Error in Troubleshooting System Services.
Next Steps
The QueryMetadata class contains all the methods and properties for a single query. If you are working with other objects such as tables, you can access the data through the corresponding metadata object, for example, the QueryMetadata class. All of the metadata contracts are contained in the Microsoft.Dynamics.AX.Framework.Services.Metadata.Contracts namespace.
See also
Walkthrough: Using the Metadata Service to Get Table Field Labels