导入 WCF 扩展的自定义元数据

在 Windows Communication Foundation (WCF) 中,元数据导入是从服务的元数据生成服务或其组成部分的抽象表示的过程。例如,WCF 可以从服务的 WSDL 文档导入 ServiceEndpoint 实例、Binding 实例或 ContractDescription 实例。若要在 WCF 中导入服务元数据,请使用 System.ServiceModel.Description.MetadataImporter 抽象类的实现。派生自 MetadataImporter 类的类型实现对导入元数据格式的支持,这些元数据格式利用了 WCF 中的 WS-Policy 导入逻辑。

自定义元数据包含系统提供的元数据导入程序无法导入的 XML 元素。通常情况下,这包括自定义 WSDL 扩展和自定义策略断言。

本节描述如何导入自定义 WSDL 扩展和策略断言。本节的重点并非导入过程本身。有关如何使用能够导出和导入元数据(无论元数据是自定义的还是系统支持的)的类型的更多信息,请参见导出和导入元数据

概述

System.ServiceModel.Description.WsdlImporter 类型是 WCF 所包含的 MetadataImporter 抽象类的实现。WsdlImporter 类型可以导入含有附加策略(这些策略捆绑在 System.ServiceModel.Description.MetadataSet 对象中)的 WSDL 元数据。默认导入程序无法识别的策略断言和 WSDL 扩展会被传送给任何已注册的自定义策略和 WSDL 导入程序,以便进行导入。通常,导入程序的实现应该能够支持用户定义的绑定元素或修改已导入的协定。

本节介绍以下内容:

  1. 如何实现和使用 System.ServiceModel.Description.IWsdlImportExtension 接口,该接口在生成说明和代码之前向自定义导入程序公开 WSDL 数据。可以使用此接口检查或修改使用给定元数据集执行的说明类型和代码编译。
  2. 如何实现和使用 System.ServiceModel.Description.IPolicyImportExtension 接口,该接口在生成说明对象之前向导入程序公开策略断言。可以使用此接口检查或修改基于所下载策略的绑定或协定。

有关导出自定义 WSDL 和策略断言的更多信息,请参见导出 WCF 扩展的自定义元数据

导入自定义 WSDL 扩展

若要添加对导入 WSDL 扩展的支持,请实现 IWsdlImportExtension 接口,然后将实现添加到 WsdlImportExtensions 属性。WsdlImporter 还可以加载应用程序配置文件中注册的 IWsdlImportExtension 接口的实现。请注意,默认情况下会注册许多 WSDL 导入程序,并且已注册的 WSDL 导入程序的顺序很重要。

WsdlImporter 加载并使用自定义 WSDL 导入程序时,将首先调用 BeforeImport 方法以便在导入过程开始之前修改元数据。接下来将导入协定,并随后调用 ImportContract 方法以便对从元数据导入的协定进行修改。最后,调用ImportEndpoint 方法以便对导入的终结点进行修改。

有关更多信息,请参见如何:导入自定义 WSDL

导入自定义策略断言

WsdlImporter 类型和 ServiceModel Metadata Utility Tool (Svcutil.exe) 能够自动处理附加到 WSDL 文档的策略表达式中的各种策略断言类型。这些工具可以收集、规范化和合并附加到 WSDL 绑定和 WSDL 端口的策略表达式。

若要添加对导入自定义策略断言的支持,请实现 IPolicyImportExtension 接口,然后将实现添加到 PolicyImportExtensions 属性。MetadataImporter 还可以加载应用程序配置文件中注册的 IPolicyImportExtension 接口的实现。请注意,默认情况下会注册许多策略导入程序,并且已注册的策略导入程序的顺序很重要。

元数据系统会对所有已注册的策略导入扩展反复调用 System.ServiceModel.Description.IPolicyImportExtension.ImportPolicy(System.ServiceModel.Description.MetadataImporter,System.ServiceModel.Description.PolicyConversionContext) 方法,以获取附加到消息、操作和终结点策略主题上的策略替代项的每个组合。在导入 WSDL 端口时,将首先合并附加到端口以及附加到相应的 WSDL 绑定的策略,然后再调入策略导入扩展。策略替代项是以 PolicyAssertionCollection 对象的形式通过 PolicyConversionContext 提供的。每个 PolicyAssertionCollection 都是由 XmlElement 对象表示的策略断言的集合。

PolicyConversionContext 对象上的 ContractBindingElements 属性公开了从 WSDL 导入的 ContractDescriptionBindingElement 对象。策略导入扩展通过以下方式处理策略断言:查找特定策略断言类型的实例、对 ContractDescriptionBindingElement 对象进行相应的更改,然后从相应的 PolicyAssertionCollection 实例中删除策略断言。

由于不会对 wsp:Optional 属性和嵌套的策略表达式进行规范化,因此策略导入扩展必须处理这些策略构造。另外,具有相同的 ContractDescriptionBindingElement 对象的策略导入扩展可能会被调用多次,因此策略导入扩展应该足够可靠以便适应这一行为。

提示

可能将无效或不正确的元数据传递给导入程序。请确保自定义导入程序对所有形式的 XML 都能保持可靠性。

另请参见

任务

如何:导入自定义 WSDL
如何:导入自定义策略断言
如何:编写 ServiceContractGenerator 的扩展