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
eMicrosoft.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:
GenerateFlatfileCompatibleIdocSchema
ReceiveIDocFormat
EnableSafeTyping
FlatFileSegmentIndicator
È necessario assicurarsi che queste proprietà di associazione siano impostate sui valori necessari per l'applicazione prima di aprire l'oggetto di recupero dei metadati. Per altre informazioni sulle proprietà di associazione dell'adapter SAP, vedere Informazioni sull'adapter BizTalk per le proprietà di associazione di mySAP Business Suite.
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);
…