IMetadataRetrievalContract を使用して SAP でメタデータを取得する
Microsoft BizTalk Adapter for mySAP Business Suite では 、IMetadataRetrievalContractエンドポイントが公開されています。このエンドポイントを使用すると、SAP システム成果物を参照および検索したり、Web サービス記述言語 (WSDL) ドキュメントの形式で操作用のメタデータを取得したりできます。
IMetadataRetrievalContract インターフェイスは、Microsoft Windows Communication Foundation (WCF) 基幹業務 (LOB) アダプター SDK によって実装され、メタデータの参照、検索、および取得機能を提供します。 IMetadataRetrievalContract インターフェイスに加えて、WCF LOB アダプター SDK は、インターフェイスを実装する MetadataRetrievalClient クラスを公開します。 メタデータを操作するには、 IMetadataRetrievalContract チャネルまたは MetadataRetrievalClient のいずれかを使用できます。メタデータの参照、検索、および取得に公開されるメソッドは、いずれの場合も同じです。
次のセクションでは、 IMetadataRetrievalContract インターフェイスの使用方法について説明します。
IMetadataRetrievalContract インターフェイス
次の表に、 IMetadataRetrievalContract インターフェイスを操作するときに使用される重要なクラスに関する情報を示します。
クラスまたはインターフェイス | 説明 |
---|---|
IMetadataRetrievalContract インターフェイス (Microsoft.ServiceModel.Channels) |
Browse、Search、GetMetadata の各メソッドを定義します。 これらのメソッドを呼び出すには、 IMetadataRetrievalContract チャネルまたは MetadataRetrievalClient を使用してアダプター メタデータを操作します。 |
MetadataRetrievalClient クラス (Microsoft.ServiceModel.Channels) |
IMetadataRetrievalContract インターフェイスを実装します。 このクラスのインスタンスを作成し、 SAPBinding と EndpointAddress を指定して SAP システム用に構成できます。 その後、そのメソッドを呼び出してメタデータを操作できます。 |
MetadataRetrievalNode クラス (Microsoft.ServiceModel.Channels) |
アダプターのメタデータ ノードを表します。 Browse メソッドと Search メソッドは、この型のノードを返し、GetMetadata メソッドはこの型のノードをパラメーターとして受け取ります。 |
ServiceDescription クラス (System.Web.Services.Description) |
有効な WSDL ドキュメント ファイルを作成および書式設定する手段を提供します。 GetMetadata メソッドは ServiceDescription オブジェクトを返します。 |
IMetadataRetrievalContract インターフェイス、MetadataRetrievalClient クラス、MetadataRetrievalNode クラスの詳細については、の Microsoft.ServiceModel.Channels マネージド リファレンスをhttps://go.microsoft.com/fwlink/?LinkId=105566参照してください。
メタデータ ノード ID
アダプターは、メタデータをノードの階層ツリーとして整理します。 このツリー構造内には、次の 2 種類のメタデータ ノードがあります。
操作ノード は、アダプターが SAP 成果物に対して表示する操作を表します。 操作ノードはツリーの葉です。
カテゴリ ノード は、SAP 成果物と、アダプター上の操作に直接対応しない SAP 成果物のグループを表します。 カテゴリ ノードはツリーの分岐です。他のカテゴリ ノードや操作ノードが含まれています。 たとえば、RFC 機能グループまたは SAP ビジネス オブジェクトはカテゴリ ノードとして表されます。
アダプターによって表示される各メタデータ ノードは、一意のノード ID によって識別されます。 アダプターによって表示されるメタデータ ノード ID の詳細については、「 メタデータ ノード ID」を参照してください。 IMetadataRetrievalContract インターフェイスを使用してメタデータを参照、検索、取得する場合は、これらのノード ID を使用してターゲット SAP 成果物を指定します。 および で
Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants
Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants
定義されている定数を使用して、メタデータ ノード ID を構築できます。
バインドのプロパティ
メタデータを操作するために IMetadataRetrievalContract チャネルまたは IMetadataRetrievalClient のどちらを使用する場合でも、インスタンスの作成時に SAPBinding を 指定する必要があります。
アダプターがメタデータを生成する方法に影響を与えるバインディング プロパティがいくつかあります。 それらのプロパティは以下のとおりです。
GenerateFlatfileCompatibleIdocSchema
ReceiveIDocFormat
EnableSafeTyping
FlatFileSegmentIndicator
メタデータ取得オブジェクトを開く前に、これらのバインド プロパティがアプリケーションに必要な値に設定されていることを確認する必要があります。 SAP アダプターバインドプロパティの詳細については、「 BizTalk Adapter for mySAP Business Suite Binding Properties」を参照してください。
メタデータ ノードの参照
Browse メソッドを使用して、親ノードに含まれるすべてのメタデータ ノードを返します。 次の例では、SAP システム上の最初の 3 つの RFC 機能グループを参照します。 この例では、 client は 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);
重要
カテゴリ ノードのみを参照できます。操作ノードを参照することはできません。
メタデータ ノードの検索
Search メソッドを使用して、親ノードに含まれるノードの検索を実行します。 アスタリスク (*) ワイルドカード文字を指定できます。 この文字は、0 個以上の文字と一致します。 次の例は、文字列 "BAPI" を含むすべての RFC の検索を示しています。 この例では、 client は 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);
重要
検索は、限られたノード セットでのみサポートされます。 検索がサポートされているノードと、検索式でサポートされるワイルドカード文字の詳細については、「 メタデータ ノード ID」を参照してください。
操作のメタデータの取得 (WSDL)
GetMetadata メソッドを使用して、操作ノードのグループのサービス記述 (WSDL ドキュメント) を取得します。 次の例では、BAPI_TRANSACTION_COMMIT RFC のサービスの説明を取得します。 この例では、 client は MetadataRetrievalClient のインスタンスです。 操作ノードのノード ID は、その操作のメッセージ アクションと同じであることに注意してください。
// 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);
重要
操作ノードは 、GetMetadata メソッドでのみ指定する必要があります。
MetadataRetrievalClient の使用
MetadataRetrievalClient の作成と使用は、他の WCF クライアントとほぼ同じです。 クライアントを作成するには、 エンドポイントと SAPBinding のインスタンスを指定します。 これは、構成で宣言的に行うか、コードで強制的に行うことができます。 次に、 MetadataRetrievalClient のメソッドを呼び出して、アダプターからメタデータを参照、検索、および取得します。
次の例は、 MetadataRetrievalClient を使用して、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();
}
}
}
}
}
コンソールでのこのプログラムの出力を次に示します。 各メソッドで返されるメタデータ取得ノードの構造を確認できます。 また、このプログラムは、検索によって返されるノードで構成されるサービス コントラクトを記述する WSDL ドキュメントをファイルに書き込みます。 (ほとんどの SAP インストールでは、サービスの説明にBAPI_TRANSACTION_COMMIT操作と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
IMetadataRetrievalContract チャネルの使用
また、IMetadataRetrievalContract チャネルを作成し、このチャネルを使用して、アダプターからメタデータを参照、検索、および取得することもできます。 (メソッドシグネチャは MetadataRetrievalClient クラスの場合と同じです)。次の例は、これを行う方法を示しています。
…
//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);
…