Condividi tramite


Ottenere metadati in SAP usando IMetadataRetrievalContract

L'adapter Microsoft BizTalk per mySAP Business Suite espone un endpoint IMetadataRetrievalContractche è possibile usare per esplorare e cercare gli artefatti del sistema SAP e recuperare i metadati sotto forma di un documento WSDL (Web Services Description Language) per le operazioni.

L'interfaccia IMetadataRetrievalContract viene implementata da Microsoft Windows Communication Foundation (WCF) Line of Business Adapter SDK (LOB) e fornisce funzionalità di navigazione, ricerca e recupero dei metadati. Oltre all'interfaccia IMetadataRetrievalContract , WCF LOB Adapter SDK espone la classe MetadataRetrievalClient , che implementa l'interfaccia. È possibile usare un canale IMetadataRetrievalContract o un MetadataRetrievalClient per usare i metadati; i metodi esposti per esplorare, cercare e recuperare i metadati sono uguali in ogni caso.

Le sezioni seguenti forniscono informazioni su come usare l'interfaccia IMetadataRetrievalContract .

Interfaccia IMetadataRetrievalContract

Nella tabella seguente vengono fornite informazioni sulle classi importanti usate quando si usa l'interfaccia IMetadataRetrievalContract .

Classe o interfaccia Descrizione
Interfaccia IMetadataRetrievalContract

(Microsoft.ServiceModel.Channels)
Definisce i metodi Browse, Search e GetMetadata . Si richiamano questi metodi usando un canale IMetadataRetrievalContract o un MetadataRetrievalClient per usare i metadati dell'adattatore.
Classe MetadataRetrievalClient

(Microsoft.ServiceModel.Channels)
Implementa l'interfaccia IMetadataRetrievalContract . È possibile creare un'istanza di questa classe e configurarla per il sistema SAP fornendo un SAPBinding e un endpointAddress. È quindi possibile richiamare i metodi per usare i metadati.
Classe MetadataRetrievalNode

(Microsoft.ServiceModel.Channels)
Rappresenta un nodo dei metadati nella scheda. I metodi Sfoglia e Ricerca restituiscono nodi di questo tipo e il metodo GetMetadata accetta i nodi di questo tipo come parametro.
Classe ServiceDescription

(System.Web.Services.Description)
Fornisce un mezzo per creare e formattare un file di documento WSDL valido. Il metodo GetMetadatarestituisce un oggetto ServiceDescription .

Per altre informazioni sull'interfaccia IMetadataRetrievalContract , sulla classe MetadataRetrievalClient e sulla classe MetadataRetrievalNode ; vedere il riferimento gestito di Microsoft.ServiceModel.Channels all'indirizzo https://go.microsoft.com/fwlink/?LinkId=105566.

ID dei nodi di metadati

L'adapter organizza i metadati come albero gerarchico di nodi. All'interno di questa struttura ad albero sono presenti due tipi di nodi di metadati:

  • I nodi dell'operazione rappresentano operazioni che l'adattatore viene eseguito sugli artefatti SAP. I nodi dell'operazione sono le foglie dell'albero.

  • I nodi categoria rappresentano artefatti SAP e raggruppamenti di artefatti SAP che non corrispondono direttamente a un'operazione nell'adattatore. I nodi categoria sono i rami dell'albero; contengono altri nodi di categoria e/o nodi dell'operazione. Ad esempio, i gruppi funzionali RFC o gli oggetti business SAP sono rappresentati come nodi categoria.

    Ogni nodo di metadati eseguito dall'adattatore viene identificato da un ID nodo univoco. Per altre informazioni sugli ID del nodo dei metadati visualizzati dall'adattatore, vedere ID nodo metadati. Questi ID nodo vengono usati per specificare gli artefatti SAP di destinazione quando si usa l'interfaccia IMetadataRetrievalContract per esplorare, cercare e recuperare i metadati. È possibile usare le costanti definite in Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants e Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants per creare ID dei nodi dei metadati.

Proprietà di associazione

Se si usa un canale IMetadataRetrievalContract o un IMetadataRetrievalClient per usare i metadati, è necessario specificare un SAPBinding quando si crea l'istanza.

Esistono diverse proprietà di associazione che influiscono sul modo in cui la scheda genera metadati. Le proprietà sono riportate di seguito:

Esplorazione dei nodi dei metadati

Si usa il metodo Browse per restituire tutti i nodi di metadati contenuti in un nodo padre. Nell'esempio seguente vengono visualizzati i primi tre gruppi funzionali RFC nel sistema SAP. In questo esempio il client è un'istanza di MetadataRetrievalClient.

// The first parameter is the node ID.
// The second parameter is the start index.
// The third parameter is the maximum number of nodes to return.
IMetadataRetrievalNode[] nodes = client.Browse(Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection, 0, 3);

Importante

È possibile esplorare solo i nodi delle categorie; non è possibile esplorare i nodi dell'operazione.

Ricerca di nodi metadati

Usare il metodo Search per eseguire una ricerca di nodi contenuti in un nodo padre. È possibile specificare il carattere jolly (*) asterisco (*) . Questo carattere corrisponde a zero o più caratteri. Nell'esempio seguente viene illustrata una ricerca di tutte le schede di rete che contengono la stringa "BAPI". In questo esempio il client è un'istanza di MetadataRetrievalClient.

// Search for all nodes that contain "BAPI" under the RFC node.
// The parameters are the parent node ID, the search expression, and
// the maximum number of nodes to return.
IMetadataRetrievalNode[] nodes = client.Search(Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection, "*BAPI*", int.MaxValue);

Importante

La ricerca è supportata solo in un set limitato di nodi. Per altre informazioni sui nodi in cui è supportata la ricerca e sul carattere jolly supportato nelle espressioni di ricerca, vedere ID nodo metadati.

Recupero dei metadati (WSDL) per le operazioni

Si usa il metodo GetMetadata per recuperare una descrizione del servizio (documento WSDL) per un gruppo di nodi dell'operazione. Nell'esempio seguente viene recuperata una descrizione del servizio per la BAPI_TRANSACTION_COMMIT RFC. In questo esempio il client è un'istanza di MetadataRetrievalClient. Si noti che l'ID nodo per un nodo operazione equivale all'azione del messaggio per tale operazione.

// Get a WSDL document that specifies a contract that contains the
// BAPI_TRANSACTION_COMMIT operation.
MetadataRetrievalNode[] nodes = new MetadataRetrievalNode[1];
nodes[0] = new MetadataRetrievalNode();
nodes[0].NodeId = Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants.RfcActionPrefix + "BAPI_TRANSACTION_COMMIT";
nodes[0].IsOperation = true;

System.Web.Services.Description.ServiceDescription description = client.GetMetadata(nodes);

Importante

È consigliabile specificare solo i nodi dell'operazione nel metodo GetMetadata .

Uso di un metadataRetrievalClient

La creazione e l'uso di un oggetto MetadataRetrievalClient è molto uguale a qualsiasi altro client WCF. Creare il client specificando un endpoint e un'istanza di SAPBinding. È possibile eseguire questa operazione in modo dichiarativo nella configurazione o in modo imperativo nel codice. Si richiamano quindi i metodi di MetadataRetrievalClient per esplorare, cercare e recuperare i metadati dall'adapter.

Nell'esempio seguente viene illustrato come usare metadatiRetrievalClient per esplorare, cercare e recuperare i metadati dall'adapter SAP.

using System;
using System.Collections.Generic;
using System.Text;

using System.ServiceModel;
using Microsoft.Adapters.SAP;
using Microsoft.ServiceModel.Channels;

using System.Web.Services.Description;

namespace SapMetaDataBrowseClient
{
    class NodeWriter
    {
        // This method writes the value of a collection of metadata retrieval nodes
        // to the console.
        public void Write(string title, MetadataRetrievalNode[] nodes)
        {
            Console.WriteLine(title);
            Console.WriteLine();

            //Write all the nodes returned to the console.
            foreach (MetadataRetrievalNode node in nodes)
            {
                Console.WriteLine("NodeId = " + node.NodeId);
                Console.WriteLine("\tDirection   = " + node.Direction.ToString());
                Console.WriteLine("\tIsOperation = " + node.IsOperation.ToString());
                Console.WriteLine("\tDisplayName = " + node.DisplayName);
                Console.WriteLine("\tDescription = " + node.Description);
            }
            Console.WriteLine();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MetadataRetrievalClient browser = null;
            NodeWriter nodeWriter = new NodeWriter();

            try
            {
                // Create a binding
                SAPBinding binding = new SAPBinding();

                EndpointAddress address = new EndpointAddress("sap://Client=800;lang=EN@A/YourSAPHost/00");

                browser = new MetadataRetrievalClient(binding, address);
                browser.ClientCredentials.UserName.UserName = "YourUserName";
                browser.ClientCredentials.UserName.Password = "YourPassword";
                browser.Open();

                // Return the nodes directly under the root.
                // The parameters are the parent node ID, the start index, and the maximum number
                // of nodes to return.
                MetadataRetrievalNode[] nodes = browser.Browse(MetadataRetrievalNode.Root.NodeId, 0, int.MaxValue);
                nodeWriter.Write("Browse results for the root node:", nodes);

                // Return first 3 RFC group nodes.
                nodes = browser.Browse(Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection, 0, 3);
                nodeWriter.Write(String.Format("Browse results for the first {1} nodes of {0}:", Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection, nodes.Length), nodes);

                // Search for first 3 nodes that begin with "BAPI_TRANSACTION" under the RFC node.
                // The parameters are the parent node ID, the search expression, and the maximum number
                // of nodes to return.
                nodes = browser.Search(Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection, "*BAPI_TRANSACTION*", 3);
                nodeWriter.Write(String.Format("Search results for \"*BAPI_TRANSACTION*\" under {0} node:", Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection), nodes);

                // Get a WSDL document that specifies a contract that contains the operations
                // found in the search and write it to a file.
                // You could explicitly specify operations as in the following:
                //    nodes[0] = new MetadataRetrievalNode();
                //    nodes[0].NodeId = Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants.RfcActionPrefix + "BAPI_TRANSACTION_COMMIT";
                //    nodes[0].IsOperation = true;
                // Note that the operation NodeId is equivalent to the message action.
                System.Web.Services.Description.ServiceDescription description = browser.GetMetadata(nodes);
                description.Write("SampleContract.wsdl");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception is: " + ex.Message);
            }
            finally
            {
                if (browser != null)
                {
                    if (browser.State == CommunicationState.Opened)
                        browser.Close();
                    else
                        browser.Abort();
                }
            }
        }
    }
}

Di seguito viene illustrato l'output di questo programma nella console. È possibile visualizzare la struttura dei nodi di recupero dei metadati restituiti per ogni metodo. Il programma scrive anche un documento WSDL che descrive un contratto di servizio costituito dai nodi restituiti dalla ricerca in un file. Per la maggior parte delle installazioni SAP, la descrizione del servizio conterrà le operazioni di BAPI_TRANSACTION_COMMIT e BAPI_TRANSACTION_ROLLBACK.

Browse results for the root node:

NodeId = http://Microsoft.LobServices.Sap/2007/03/BAPISECTION/000001
        Direction   = Outbound
        IsOperation = False
        DisplayName = BAPI
        Description = BAPI
NodeId = http://Microsoft.LobServices.Sap/2007/03/IDOCSECTION/
        Direction   = Inbound, Outbound
        IsOperation = False
        DisplayName = IDOC
        Description = IDOC
NodeId = http://Microsoft.LobServices.Sap/2007/03/RFCSECTION/
        Direction   = Inbound, Outbound
        IsOperation = False
        DisplayName = RFC
        Description = RFC
NodeId = http://Microsoft.LobServices.Sap/2007/03/TRFCSECTION/
        Direction   = Inbound, Outbound
        IsOperation = False
        DisplayName = TRFC
        Description = TRFC

Browse results for the first 3 nodes of http://Microsoft.LobServices.Sap/2007/03
/RFCSECTION/:

NodeId = http://Microsoft.LobServices.Sap/2007/03/RFCGROUP/A
        Direction   = Inbound, Outbound
        IsOperation = False
        DisplayName = Asset Accounting
        Description = Asset Accounting
NodeId = http://Microsoft.LobServices.Sap/2007/03/RFCGROUP/S
        Direction   = Inbound, Outbound
        IsOperation = False
        DisplayName = Basis
        Description = Basis
NodeId = http://Microsoft.LobServices.Sap/2007/03/RFCGROUP/B
        Direction   = Inbound, Outbound
        IsOperation = False
        DisplayName = Business Information Warehouse
        Description = Business Information Warehouse

Search results for "*BAPI_TRANSACTION*" under http://Microsoft.LobServices.Sap/2
007/03/RFCSECTION/ node:

NodeId = http://Microsoft.LobServices.Sap/2007/03/Rfc/BAPI_TRANSACTION_COMMIT
        Direction   = Inbound, Outbound
        IsOperation = True
        DisplayName = BAPI_TRANSACTION_COMMIT
        Description = Execute external Commit when using BAPIs
NodeId = http://Microsoft.LobServices.Sap/2007/03/Rfc/BAPI_TRANSACTION_ROLLBACK
        Direction   = Inbound, Outbound
        IsOperation = True
        DisplayName = BAPI_TRANSACTION_ROLLBACK
        Description = Execute external Rollback when using BAPIs

Uso di un canale IMetadataRetrievalContract

È anche possibile creare un canale IMetadataRetrievalContract e quindi usare questo canale per esplorare, cercare e recuperare i metadati dall'adapter. Le firme del metodo sono uguali a per la classe MetadataRetrievalClient . Nell'esempio seguente viene illustrato come eseguire questa operazione.

…
//Create a binding and endpoint address.
SAPBinding binding = new SAPBinding();
EndpointAddress address = new EndpointAddress("sap://Client=800;lang=EN@A/YourSAPHost/00");

//Create and open a channel factory that will return an IMetadataRetrievalContract object, on which browse, search, and get can be performed.
ChannelFactory<IMetadataRetrievalContract> factory = new ChannelFactory<IMetadataRetrievalContract>(binding, address);
factory.Credentials.UserName.UserName = "YourUserName";
factory.Credentials.UserName.Password = "YourPassword";
factory.Open();

//Obtain an IMetadataRetrievalContract channel from the factory.
IMetadataRetrievalContract channel = factory.CreateChannel();

//Perform a search using the channel.
MetadataRetrievalNode[] nodes = channel.Search(Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants.RfcSection, "BAPI_TRANSACTION*", int.MaxValue);
…

Vedere anche

Recupero dei metadati a livello di codice da SAP