在 Windows Communication Foundation(WCF)中,导出元数据是描述服务终结点并将其投影到并行标准化表示形式的过程,客户端可以使用这些表示形式来了解如何使用该服务。 导入服务元数据是一个从服务元数据生成 ServiceEndpoint 实例或部分的过程。
导出元数据
若要从 System.ServiceModel.Description.ServiceEndpoint 实例导出元数据,请使用抽象类的 MetadataExporter 实现。 在 WCF 中,WsdlExporter 抽象类的实现是 MetadataExporter 类型。
该System.ServiceModel.Description.WsdlExporter类型生成了带有附加策略表达式的 Web 服务描述语言(WSDL)元数据,并将这些表达式封装在MetadataSet实例中。 可以使用System.ServiceModel.Description.WsdlExporter实例来迭代导出ContractDescription对象和ServiceEndpoint对象的元数据。 还可以导出对象的 ServiceEndpoint 集合,并将其与特定服务名称相关联。
注释
只能使用 WsdlExporter
从包含公共语言运行时 (CLR) 类型信息的 ContractDescription
实例导出元数据,例如使用 ContractDescription
方法创建的 ContractDescription.GetContract
实例,或作为 ServiceDescription
实例的一部分创建的 ServiceHost
实例。 对于从服务元数据导入的或构建时没有类型信息的WsdlExporter
实例,您不能使用 ContractDescription
从此类实例导出元数据。
导入元数据
导入 WSDL 文档
若要在 WCF 中导入服务元数据,请使用抽象类的 MetadataImporter 实现。 在 WCF 中,System.ServiceModel.Description.WsdlImporter 抽象类的实现是 MetadataImporter 类型。 该 WsdlImporter 类型将附加策略捆绑在对象 MetadataSet 中以导入 WSDL 元数据。
该 WsdlImporter 类型允许你控制如何导入元数据。 可以导入所有终结点、所有绑定或所有协定。 可以导入与特定 WSDL 服务、绑定或端口类型关联的所有终结点。 还可以导入特定的 WSDL 端口的终结点、特定的 WSDL 绑定的绑定或特定的 WSDL 端口类型的协定。
WsdlImporter 还公开了一个 KnownContracts 属性,允许你指定不需要导入的一组协定。 WsdlImporter 使用 KnownContracts 属性中的契约,而不是从元数据中导入具有相同限定名称的契约。
导入策略
该 WsdlImporter 类型收集附加到消息、操作和终结点策略主体的策略表达式,然后使用 IPolicyImportExtension 集合中的 PolicyImportExtensions 实现来导入这些策略表达式。
策略导入逻辑会自动处理对同一 WSDL 文档中策略表达式的策略引用,并通过wsu:Id
或xml:id
属性进行标识。 策略导入逻辑通过将策略表达式的大小限制为 4096 个节点,其中节点是下列元素wsp:Policy
wsp:All
wsp:ExactlyOne
wsp:policyReference
之一,从而保护应用程序免受循环策略引用。
策略导入逻辑还会自动规范化策略表达式。 嵌套策略表达式和 wsp:Optional
属性未规范化。 规范化处理的执行步数限制为 4096 步,其中每个步骤生成一个策略断言,或是一个 wsp:ExactlyOne
元素的子元素。
WsdlImporter 类型最多尝试 32 种附加到不同 WSDL 策略主题的备用策略组合。 如果没有组合能够顺利导入,则使用第一个组合来构建部分自定义绑定。
错误处理
两者MetadataExporter和MetadataImporter类型都公开一个Errors
属性,该属性可以包含在导出和导入过程中遇到的错误和警告信息集合,并且这些信息在实现工具时可以使用。
WsdlImporter 类型通常会为在导入过程中捕获的异常引发一个异常,并且将相应的错误添加到其 Errors
属性中。
ImportAllContracts、ImportAllBindings、ImportAllEndpoints和ImportEndpoints方法不会抛出这些异常,因此必须检查Errors
属性以确定调用这些方法时是否发生了任何问题。
该WsdlExporter类型会在导出过程中抛出所捕获的任何异常。 这些异常没有在Errors
属性中被记录为错误。
WsdlExporter引发异常后,它处于错误状态,无法重复使用。 当某个操作无法导出时,该 WsdlExporter确实会向其 Errors
属性添加警告,因为使用了通配符操作并且遇到了重复绑定名称。
本节中
如何:将元数据导入服务终结点
介绍如何将下载的元数据导入说明对象。
如何:从服务终结点导出元数据
介绍如何将描述对象导出到元数据中。
ServiceDescription 和 WSDL 引用
描述说明对象与 WSDL 之间的映射。
如何:使用 Svcutil.exe 从已编译的服务代码导出元数据
描述如何使用 Svcutil.exe 导出已编译程序集中的服务、协定和数据类型的元数据。
数据协定架构参考
描述 DataContractSerializer 用来说明 XML 序列化的公共语言运行库 (CLR) 类型的 XML 架构 (XSD) 的子集。