Freigeben über


Abrufen von Metadaten in SAP mithilfe von IMetadataRetrievalContract

Der Microsoft BizTalk-Adapter für mySAP Business Suite macht einen IMetadataRetrievalContract-Endpunktverfügbar, mit dem Sie SAP-Systemartefakte durchsuchen und suchen und Metadaten in Form eines WSDL-Dokuments (Web Services Description Language) für Vorgänge abrufen können.

Die IMetadataRetrievalContract-Schnittstelle wird vom LOB-Adapter-SDK (Microsoft Windows Communication Foundation) implementiert und bietet Funktionen zum Durchsuchen, Suchen und Abrufen von Metadaten. Zusätzlich zur IMetadataRetrievalContract-Schnittstelle macht das WCF LOB Adapter SDK die MetadataRetrievalClient-Klasse verfügbar, die die -Schnittstelle implementiert. Sie können entweder einen IMetadataRetrievalContract-Kanal oder einen MetadataRetrievalClient verwenden, um mit Metadaten zu arbeiten. Die Methoden, die zum Durchsuchen, Suchen und Abrufen von Metadaten verfügbar gemacht werden, sind in jedem Fall identisch.

Die folgenden Abschnitte enthalten Informationen zur Verwendung der IMetadataRetrievalContract-Schnittstelle .

Die IMetadataRetrievalContract-Schnittstelle

Die folgende Tabelle enthält Informationen zu wichtigen Klassen, die beim Arbeiten mit der IMetadataRetrievalContract-Schnittstelle verwendet werden.

Klasse oder Schnittstelle BESCHREIBUNG
IMetadataRetrievalContract-Schnittstelle

(Microsoft.ServiceModel.Channels)
Definiert die Methoden Browse, Search und GetMetadata . Sie rufen diese Methoden entweder mithilfe eines IMetadataRetrievalContract-Kanals oder eines MetadataRetrievalClient auf, um mit Adaptermetadaten zu arbeiten.
MetadataRetrievalClient-Klasse

(Microsoft.ServiceModel.Channels)
Implementiert die IMetadataRetrievalContract-Schnittstelle . Sie können eine instance dieser Klasse erstellen und für Ihr SAP-System konfigurieren, indem Sie eine SAPBinding und eine EndpointAddress angeben. Anschließend können Sie die zugehörigen Methoden aufrufen, um mit Metadaten zu arbeiten.
MetadataRetrievalNode-Klasse

(Microsoft.ServiceModel.Channels)
Stellt einen Metadatenknoten auf dem Adapter dar. Die Methoden Browse und Search geben Knoten dieses Typs zurück, und die GetMetadata-Methode verwendet Knoten dieses Typs als Parameter.
ServiceDescription-Klasse

(System.Web.Services.Description)
Stellt eine Möglichkeit zum Erstellen und Formatieren einer gültigen WSDL-Dokumentdatei bereit. Die GetMetadata-Methode gibt ein ServiceDescription-Objekt zurück.

Weitere Informationen zur IMetadataRetrievalContract-Schnittstelle , zur MetadataRetrievalClient-Klasse und zur MetadataRetrievalNode-Klasse ; Weitere Informationen finden Sie in der verwalteten Referenz zu Microsoft.ServiceModel.Channels unter https://go.microsoft.com/fwlink/?LinkId=105566.

IDs von Metadatenknoten

Der Adapter organisiert seine Metadaten als hierarchische Struktur von Knoten. Innerhalb dieser Strukturstruktur gibt es zwei Arten von Metadatenknoten:

  • Vorgangsknoten stellen Vorgänge dar, die der Adapter auf SAP-Artefakten zeigt. Vorgangsknoten sind die Blätter der Struktur.

  • Kategorieknoten stellen SAP-Artefakte und Gruppierungen von SAP-Artefakten dar, die nicht direkt einem Vorgang auf dem Adapter entsprechen. Kategorieknoten sind die Verzweigungen der Struktur. sie enthalten andere Kategorieknoten und/oder Vorgangsknoten. Beispielsweise werden RFC-Funktionsgruppen oder SAP-Geschäftsobjekte als Kategorieknoten dargestellt.

    Jeder Metadatenknoten, der vom Adapter angezeigt wird, wird durch eine eindeutige Knoten-ID identifiziert. Weitere Informationen zu den vom Adapter angezeigten Metadatenknoten-IDs finden Sie unter Metadatenknoten-IDs. Sie verwenden diese Knoten-IDs, um SAP-Zielartefakte anzugeben, wenn Sie die IMetadataRetrievalContract-Schnittstelle zum Durchsuchen, Durchsuchen und Abrufen von Metadaten verwenden. Sie können die in Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstantsMicrosoft.Adapters.SAP.SAPAdapterConstants.ActionConstants und definierten Konstanten verwenden, um Metadatenknoten-IDs zu erstellen.

Bindungseigenschaften

Unabhängig davon, ob Sie einen IMetadataRetrievalContract-Kanal oder einen IMetadataRetrievalClient verwenden, um mit Metadaten zu arbeiten, müssen Sie beim Erstellen der instance eine SAPBinding angeben.

Es gibt mehrere Bindungseigenschaften, die beeinflussen, wie der Adapter Metadaten generiert. Diese Eigenschaften sind:

Durchsuchen von Metadatenknoten

Sie verwenden die Browse-Methode , um alle Metadatenknoten zurückzugeben, die in einem übergeordneten Knoten enthalten sind. Im folgenden Beispiel wird nach den ersten drei RFC-Funktionsgruppen im SAP-System gesucht. In diesem Beispiel ist der Client eine instance von 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);

Wichtig

Sie können nur Kategorieknoten durchsuchen. Vorgangsknoten können nicht durchsucht werden.

Suchen nach Metadatenknoten

Sie verwenden die Search-Methode , um eine Suche nach Knoten durchzuführen, die in einem übergeordneten Knoten enthalten sind. Sie können das Sternchen (*) als Platzhalterzeichen angeben. Dieses Zeichen entspricht null oder mehr Zeichen. Das folgende Beispiel zeigt eine Suche nach allen RFCs, die die Zeichenfolge "BAPI" enthalten. In diesem Beispiel ist der Client eine instance von 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);

Wichtig

Die Suche wird nur für eine begrenzte Anzahl von Knoten unterstützt. Weitere Informationen zu den Knoten, auf denen die Suche unterstützt wird, und zu den in Suchausdrücken unterstützten Wildcardzeichen finden Sie unter Metadatenknoten-IDs.

Abrufen von Metadaten (WSDL) für Vorgänge

Sie verwenden die GetMetadata-Methode , um eine Dienstbeschreibung (WSDL-Dokument) für eine Gruppe von Vorgangsknoten abzurufen. Im folgenden Beispiel wird eine Dienstbeschreibung für die BAPI_TRANSACTION_COMMIT RFC abgerufen. In diesem Beispiel ist der Client eine instance von MetadataRetrievalClient. Beachten Sie, dass die Knoten-ID für einen Vorgangsknoten der Nachrichtenaktion für diesen Vorgang entspricht.

// 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);

Wichtig

Sie sollten nur Vorgangsknoten in der GetMetadata-Methode angeben.

Verwenden eines MetadataRetrievalClient

Das Erstellen und Verwenden eines MetadataRetrievalClient ist in etwa identisch mit jedem anderen WCF-Client. Sie erstellen den Client, indem Sie einen Endpunkt und eine instance sapBinding angeben. Sie können dies entweder deklarativ in der Konfiguration oder im Imperative in Ihrem Code tun. Anschließend rufen Sie die Methoden des MetadataRetrievalClient auf, um Metadaten aus dem Adapter zu durchsuchen, zu suchen und abzurufen.

Das folgende Beispiel zeigt, wie Sie einen MetadataRetrievalClient zum Durchsuchen, Suchen und Abrufen von Metadaten aus dem SAP-Adapter verwenden.

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();
                }
            }
        }
    }
}

Im Folgenden wird die Ausgabe dieses Programms auf der Konsole gezeigt. Sie können die Struktur der Metadatenabrufknoten sehen, die für jede Methode zurückgegeben werden. Das Programm schreibt auch ein WSDL-Dokument, das einen Dienstvertrag beschreibt, der aus den Knoten besteht, die von der Suche in eine Datei zurückgegeben werden. (Bei den meisten SAP-Installationen enthält die Dienstbeschreibung die BAPI_TRANSACTION_COMMIT und BAPI_TRANSACTION_ROLLBACK Vorgänge.)

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

Verwenden eines IMetadataRetrievalContract-Kanals

Sie können auch einen IMetadataRetrievalContract-Kanal erstellen und dann diesen Kanal zum Durchsuchen, Suchen und Abrufen von Metadaten aus dem Adapter verwenden. (Die Methodensignaturen sind identisch mit denen für die MetadataRetrievalClient-Klasse .) Im folgenden Beispiel wird gezeigt, wie Dies geschieht.

…
//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);
…

Weitere Informationen

Programmgesteuertes Abrufen von Metadaten aus SAP