在 SAP 中使用 WS-Metadata Exchange 获取元数据

作为 Windows Communication Foundation (WCF) 自定义绑定,适用于 mySAP Business Suite 的 Microsoft BizTalk 适配器公开了一个 WS-Metadata Exchange (MEX) 终结点,可用于从适用于 mySAP Business Suite 的 Microsoft BizTalk 适配器检索特定操作的元数据。

WCF 提供了丰富的基础结构,用于导出、发布、检索和导入有关服务的元数据。 WCF 服务(如适配器)使用元数据描述如何与服务终结点交互,以便工具(如 svcutil.exe)可以自动生成客户端代码来使用服务。 WCF 将服务的元数据表示为 MetadataSet 类型的实例,该类型与 WS-Metadata Exchange (MEX) 中定义的元数据序列化格式紧密相关。 可以使用 MetadataExchangeClient 为适配器上的目标操作创建 MetadataSet

WCF 对元数据交换的支持是一个广泛的主题,超出了本文档的范围。 有关 WCF 中对元数据的支持的详细信息,请参阅 上的 https://go.microsoft.com/fwlink/?LinkId=105634WCF 文档中的“元数据”。 有关 WCF 为元数据公开的体系结构、类和命名空间的特别好说明,请参阅 上的 https://go.microsoft.com/fwlink/?LinkId=105635“元数据体系结构概述”。 在继续操作之前,应熟悉这些 WCF 主题中与从 WCF 服务检索元数据相关的内容。

以下主题包含有关如何使用 MetadataExchangeClient 从 SAP 适配器检索元数据的信息。

使用 MetadataExchangeClient 检索元数据

若要使用 MetadataExchangeClient ,必须指定连接 URI 和绑定 (SAPBinding) 。 连接 URI 标识要检索元数据的操作。

以下部分包含有关如何指定连接 URI、重要绑定属性以及如何使用 MetadataExchangeClient 从适配器检索元数据的信息。

连接 URI

若要使用 MetadataExchangeClient ,必须提供一个 SAP 连接 URI,用于指定要检索元数据的 MEX 终结点和操作。 按以下方式在连接 URI 中指定 MEX 终结点和目标操作:

  • 必须在查询字符串中包含“wsdl”参数。 如果它是查询字符串中的第一个参数,则会在问号 (?) 后面指定它。 如果不是第一个参数,则它前面应带有与号 (&) 。

  • 必须遵循一个或多个“op”参数的“wsdl”参数。 每个“op”参数前面都有一个与号 (&) ,并指定目标操作 (节点 ID) 的消息操作。

    例如,以下连接 URI 面向 SALESORDER_CREATEFROMDAT201 IDOC 和 SALESORDER_CREATEFROMDAT202 IDOC 的 Send 操作。 突出显示了“wsdl”和“op”参数。

"sap://User=YourUserName;Passwd=YourPassword;Client=800;Lang=EN;@a/YourSAPHost/00?wsdl&op=http://Microsoft.LobServices.Sap/2007/03/Idoc/3/SALESORDER_CREATEFROMDAT201//620/Send&op=http://Microsoft.LobServices.Sap/2007/03/Idoc/3/SALESORDER_CREATEFROMDAT202//620/Send"

注意

无需在入站操作的连接 URI 中包含侦听器参数。 适配器作为客户端进行连接,以从 SAP 系统检索元数据。

还可以使用在 Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants 处定义的常量来帮助在创建连接 URI 时指定操作。 本主题末尾的代码示例对此进行了演示。

如何将此连接 URI 传递到 MetadataExchangeClient 取决于用于创建客户端并从适配器检索元数据的重载方法。

有关 SAP 连接 URI 的详细信息,请参阅 创建 SAP 系统连接 URI

绑定属性

创建 MetadataExchangeClient 时,必须指定 SAPBinding

有几个绑定属性会影响适配器生成元数据的方式。 这些属性为:

  • GenerateFlatfileCompatibleIdocSchema

  • ReceiveIDocFormat

  • EnableSafeTyping

  • FlatFileSegmentIndicator

    在对 MetadataExchangeClient 调用 GetMetadata 方法之前,应确保将这些绑定属性设置为应用程序所需的值。 有关 SAP 适配器绑定属性的详细信息,请参阅 了解 mySAP Business Suite 绑定属性的 BizTalk 适配器

示例

以下示例使用 MetadataExchangeClient 为BAPI_TRANSACTION_COMMIT和BAPI_TRANSACTION_ROLLBACK操作创建服务说明 (WSDL 文档) 。

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

// Needed for WCF and SAP adapter
using System.ServiceModel;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.SAP;

// Needed for MetadataExchangeClient class
using System.ServiceModel.Description;
// Needed for ServiceDescription class
using System.Web.Services;

namespace SapMetadataExchangeClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create a binding
            SAPBinding binding = new SAPBinding();

            //Create a metadata exchange client that will retrieve metadata according to the WS-MEX standard.
            MetadataExchangeClient client = new MetadataExchangeClient(binding);
            client.SoapCredentials.UserName.UserName = "YourUserName";
            client.SoapCredentials.UserName.Password = "YourPassword";

            //Set up an endpoint address and specify the operation for which we want metadata.
            string connectionUri = "sap://Client=800;lang=EN@A/YourSAPHost/00?wsdl&op="
                + Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants.RfcActionPrefix
                + "BAPI_TRANSACTION_COMMIT"
                + "&op="
                + Microsoft.Adapters.SAP.SAPAdapterConstants.ActionConstants.RfcActionPrefix
                + "BAPI_TRANSACTION_ROLLBACK";

            EndpointAddress address = new EndpointAddress(connectionUri);

            //Get the metadata.
            MetadataSet ms = client.GetMetadata(address);

            // Check for the metadata set size.
            Collection<MetadataSection> documentCollection = ms.MetadataSections;
            if (documentCollection != null && documentCollection.Count > 0)
            {
                //Get the WSDL from the metadata set
                System.Web.Services.Description.ServiceDescription wsdl = (System.Web.Services.Description.ServiceDescription)documentCollection[0].Metadata;

                //Save the WSDL to a file.
                wsdl.Write("BapiTx.wsdl");

            }

        }
    }
}

另请参阅

从 SAP 以编程方式检索元数据使用 IMetadataRetrievalContract 在 SAP 中检索元数据