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

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

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,用于指定要检索元数据的 MEX 终结点和操作。 按以下方式在连接 URI 中指定 MEX 终结点和目标操作:

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

  • 必须遵循一个或多个“op”参数的“wsdl”参数。 每个“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 上的插入、更新、删除和选择操作创建服务说明 (WSDL 文档) 。EMP 表。 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 数据库获取元数据