在 Windows Communication Foundation(WCF)中,元数据导入是指通过元数据生成服务或其组成部分的抽象表示的过程。 例如,WCF 可以从服务的 WSDL 文档导入 ServiceEndpoint 实例、 Binding 实例或 ContractDescription 实例。 若要在 WCF 中导入服务元数据,请使用抽象类的 System.ServiceModel.Description.MetadataImporter 实现。 派生自 MetadataImporter 类的类型实现对导入利用 WCF 中 WS-Policy 导入逻辑的元数据格式的支持。
自定义元数据由系统提供的元数据导入程序无法导入的 XML 元素组成。 通常,这包括自定义 WSDL 扩展和自定义策略断言。
本部分介绍如何导入自定义 WSDL 扩展和策略断言。 它不专注于导入过程本身。 有关如何使用导出和导入元数据的类型的详细信息,无论元数据是自定义还是系统支持,请参阅 导出和导入元数据。
概述
在 WCF 中,System.ServiceModel.Description.WsdlImporter 抽象类的实现是 MetadataImporter 类型。 WsdlImporter 类型可以导入含有附加策略(这些策略捆绑在 System.ServiceModel.Description.MetadataSet 对象中)的 WSDL 元数据。 默认导入程序无法识别的策略断言和 WSDL 扩展将传递给任何已注册的自定义策略和用于导入的 WSDL 导入程序。 通常,导入程序实现以支持用户定义的绑定元素或修改导入的协定。
本部分介绍:
如何实现和使用 System.ServiceModel.Description.IWsdlImportExtension 接口,该接口在生成说明和生成代码之前向自定义导入程序公开 WSDL 数据。 可以使用此接口来检查或修改使用给定的元数据集执行的说明类型和代码编译。
如何实现和使用 System.ServiceModel.Description.IPolicyImportExtension 接口,该接口在生成说明对象之前向导入程序公开策略断言。 可以使用此接口根据下载的策略检查或修改绑定或协定。
有关导出自定义 WSDL 和策略断言的详细信息,请参阅 导出 WCF 扩展的自定义元数据。
导入自定义 WSDL 扩展
若要添加对导入 WSDL 扩展的支持,请实现 IWsdlImportExtension 接口,然后将实现添加到 WsdlImportExtensions 属性。 WsdlImporter 还可以加载应用程序配置文件中注册的 IWsdlImportExtension 接口实现。 请注意,默认情况下会注册许多 WSDL 导入程序,并且已注册的 WSDL 导入程序的顺序非常重要。
使用 WsdlImporter 加载自定义 WSDL 导入程序时,首先会调用 BeforeImport 方法,以便在导入过程之前启用元数据修改。 接下来,将导入合同,然后调用 ImportContract 方法以启用对从元数据导入的合同进行修改。 最后,调用ImportEndpoint 方法以启用对导入终结点的修改。
有关详细信息,请参阅 如何:导入自定义 WSDL。
导入自定义策略断言
类型WsdlImporter和ServiceModel 元数据实用工具(Svcutil.exe)会自动处理附加于 WSDL 文档的策略表达式中的各种策略断言类型。 这些工具收集、规范化和合并附加到 WSDL 绑定和 WSDL 端口的策略表达式。
若要添加对导入自定义策略断言的支持,请实现 IPolicyImportExtension 该接口,然后将实现添加到 PolicyImportExtensions 属性。 MetadataImporter 还可以加载应用程序配置文件中注册的 IPolicyImportExtension 接口实现。 请注意,默认情况下会注册多个策略导入程序,并且已注册的策略导入程序的顺序非常重要。
元数据系统会对所有已注册的策略导入扩展反复调用 IPolicyImportExtension.ImportPolicy 方法,以获取附加到消息、操作和终结点策略主题上的策略替代项的每个组合。 在导入 WSDL 端口时,将首先合并附加到端口以及附加到相应的 WSDL 绑定的策略,然后再调入策略导入扩展。 策略替代项是以 PolicyConversionContext 对象的形式通过 PolicyAssertionCollection 提供的。 每个 PolicyAssertionCollection 断言都是由 XmlElement 对象表示的策略断言的集合。
Contract对象上的BindingElements和PolicyConversionContext属性公开了从 WSDL 导入的ContractDescription对象和BindingElement对象。 策略导入扩展通过查找特定策略断言类型的实例、对 ContractDescription 或 BindingElement 对象进行相应的更改,然后从相应的 PolicyAssertionCollection 实例中删除策略断言来处理策略断言。
属性 wsp:Optional
和嵌套策略表达式未规范化,因此策略导入扩展必须处理这些策略构造。 另外,具有相同的 ContractDescription 和 BindingElement 对象的策略导入扩展可能会被调用多次,因此策略导入扩展应该足够可靠以便适应这一行为。
重要
无效或不正确的元数据可以传递给导入程序。 确保自定义导入程序对所有形式的 XML 都可靠。