使用 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 介面時所使用的重要類別相關資訊。
類別或介面 | Description |
---|---|
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類別的詳細資訊;請參閱 上的 https://go.microsoft.com/fwlink/?LinkId=105566Microsoft.ServiceModel.Channels Managed 參考。
中繼資料節點識別碼
配接器會將其中繼資料組織為節點的階層式樹狀結構。 在此樹狀結構中,有兩種類型的中繼資料節點:
作業節點 代表配接器在 SAP 成品上呈現的作業。 作業節點是樹狀結構的分葉。
類別節點 代表 SAP 成品和 SAP 成品群組,這些成品不會直接對應至配接器上的作業。 類別節點是樹狀結構的分支;它們包含其他類別節點和/或作業節點。 例如,RFC 功能群組或 SAP 商務物件會以類別節點表示。
配接器所呈現的每個中繼資料節點都是由唯一節點識別碼來識別。 如需配接器所呈現之中繼資料節點識別碼的詳細資訊,請參閱 中繼資料節點識別碼。 當您使用 IMetadataRetrievalContract 介面來流覽、搜尋和擷取中繼資料時,您可以使用這些節點識別碼來指定目標 SAP 成品。 您可以使用 和 中
Microsoft.Adapters.SAP.SAPAdapterConstants.MetadataConstants
Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants
定義的常數來協助您建構中繼資料節點識別碼。
系結屬性
無論您是使用 IMetadataRetrievalContract 通道或 IMetadataRetrievalClient 來處理中繼資料,您都必須在建立實例時指定 SAPBinding 。
有數個系結屬性會影響配接器產生中繼資料的方式。 這些屬性是:
GenerateFlatfileCompatibleIdocSchema
ReceiveIDocFormat
EnableSafeTyping
FlatFileSegmentIndicator
在開啟中繼資料擷取物件之前,您應該確定這些系結屬性已設定為應用程式所需的值。 如需 SAP 配接器系結屬性的詳細資訊,請參閱 閱讀 BizTalk Adapter for mySAP Business Suite 系結屬性。
流覽中繼資料節點
您可以使用 Browse 方法傳回父節點中包含的所有中繼資料節點。 下列範例會流覽 SAP 系統上的前三個 RFC 功能群組。 在此範例中, 用戶端 是 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 方法來搜尋父節點所包含的節點。 您可以指定星號 (*) 萬用字元。 此字元符合零個或多個字元。 下列範例顯示搜尋包含字串 「BAPI」 的所有 RFC。 在此範例中, 用戶端 是 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);
重要
只有一組有限的節點才支援搜尋。 如需支援搜尋之節點的詳細資訊,以及搜尋運算式中支援的萬用字元,請參閱 中繼資料節點識別碼。
擷取作業的 WSDL) 中繼資料 (
您可以使用 GetMetadata 方法來擷取一組作業節點的服務描述 (WSDL 檔案) 。 下列範例會擷取BAPI_TRANSACTION_COMMIT RFC 的服務描述。 在此範例中, 用戶端 是 MetadataRetrievalClient的實例。 請注意,作業節點的節點識別碼相當於該作業的訊息動作。
// 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 operations.)
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);
…