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

作为 Windows Communication Foundation(WCF)自定义绑定,Microsoft BizTalk Adapter for Oracle 数据库公开一个 WS-Metadata Exchange(MEX)终结点,您可以使用它从 Microsoft BizTalk Adapter for Oracle 数据库检索特定操作的元数据。

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

WCF 对元数据交换的支持是一个广泛的主题,超出了本文档的范围。 有关 WCF 中元数据支持的详细信息,请参阅 元数据。 有关 WCF 为元数据公开的体系结构、类和命名空间的特别好描述,请参阅 元数据体系结构概述。 在继续之前,应熟悉与从 WCF 服务中检索元数据相关的这些 WCF 主题的内容。

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

使用 MetadataExchangeClient 检索元数据

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

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

连接 URI

若要使用MetadataExchangeClient,必须提供一个 Oracle 连接 URI,该 URI 指定一个 MEX 终结点以及要检索元数据的一个或多个操作。 可以通过以下方式在连接 URI 中指定 MEX 终结点和目标操作:

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

  • 需要在“wsdl”参数后跟随一个或多个“op”参数。 每个“op”参数前面都有一个与号(&),并指定目标操作的消息操作(节点 ID)。

    例如,以下连接 URI 目标是 SCOTT.EMP 表的插入和删除操作。 突出显示了“wsdl”和“op”参数。

"oracledb://ADAPTER?wsdl&op=http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Insert&op=http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Delete"  

注释

如果您希望修改为 POLLINGSTMT 操作生成的命名空间,应该在查询字符串中指定一个 PollingId 参数。

如何将此连接 URI 传递给 MetadataExchangeClient,取决于您使用哪种重载方法来创建客户端并从适配器检索元数据。

有关 Oracle 连接 URI 的详细信息,请参阅 “创建 Oracle 数据库连接 URI”。

绑定属性

创建 MetadataExchangeClient 时,必须指定 OracleDBBinding

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

  • EnableSafeTyping

  • UseSchemaInNamespace

  • PollingStatement

重要

如果要检索 POLLINGSTMT 操作的元数据,则必须设置 PollingStatement 绑定属性。

MetadataExchangeClient 上调用 GetMetadata 方法之前,应确保将这些绑定属性设置为应用程序所需的值。 有关 Oracle 数据库适配器绑定属性的详细信息,请参阅 有关 Oracle 数据库适配器绑定属性的信息

示例:

以下示例使用 MetadataExchangeClient 为 SCOTT.EMP 表上的插入、更新、删除和选择操作创建服务说明(WSDL 文档)。 WSDL 保存到一个文件,EmpOperations.wsdl。

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Collections.ObjectModel;  
  
// Needed for WCF and Oracle Adapter  
using System.ServiceModel;  
using Microsoft.ServiceModel.Channels;  
using Microsoft.Adapters.OracleDB;  
  
// Needced for MetadataExchangeClient class  
using System.ServiceModel.Description;  
// Needed for ServiceDescription class  
using System.Web.Services;  
  
namespace OracleMetadataExchange  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //create a binding  
            OracleDBBinding binding = new OracleDBBinding();  
  
            //create a metadata exchange client that will retrieve metadata according to the WS-MEX standard  
            MetadataExchangeClient client = new MetadataExchangeClient(binding);  
            client.SoapCredentials.UserName.UserName = "SCOTT";  
            client.SoapCredentials.UserName.Password = "TIGER";  
  
            //set up an endpoint address and specifies the operations for which we want metadata  
            string connectionUri = "oracledb://ADAPTER?wsdl"  
                + "&op="  
                + "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Insert"  
                + "&op="  
                + "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Update"  
                + "&op="  
                + "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Delete"  
                + "&op="  
                + "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Select";  
  
            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("EmpOperations.wsdl");  
  
            }  
  
        }  
    }  
}  

另请参阅

以编程方式从 Oracle 数据库获取元数据