如何:将元数据导入服务终结点
本主题说明如何将元数据导入服务终结点的集合,以及如何使用入门中定义的服务。 本主题演示如何创建从服务中导入元数据的客户端应用程序,以及之后如何对该服务调用 Add
方法。
将元数据导入服务终结点
声明 EndpointAddress 对象,并使用服务的元数据交换 (MEX) 地址的统一资源标识符 (URI) 对其进行初始化。
EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
创建 MetadataExchangeClient、传入 MEX 地址并调用 GetMetadata。 此操作将从服务中检索元数据。
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaSet = mexClient.GetMetadata();
创建 WsdlImporter、传入先前检索的元数据并调用 ImportAllContracts。 此操作将生成 ContractDescription 对象的集合。 您还可以根据需要调用 ImportAllEndpoints 或 ImportAllBindings。
WsdlImporter importer = new WsdlImporter(metaSet); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
注意
导入元数据后,将无法创建客户端通道或导出元数据。 这是因为此时没有可用的类型信息。 在实际与服务进行交互或导出元数据时需要类型信息。 若要生成类型信息,需要生成代码,如步骤 4 和 5 所示。 或者可以使用 MetadataResolver 帮助器类。 有关详细信息,请参阅如何:使用 MetadataResolver 来动态获取绑定元数据。
为每个协定生成类型信息。
ServiceContractGenerator generator = new ServiceContractGenerator(); foreach (ContractDescription contract in contracts) { generator.GenerateServiceContractType(contract); } if (generator.Errors.Count != 0) throw new Exception("There were errors during code compilation.");
现在,您可以使用此信息。 下面的示例生成 C# 源代码。
System.CodeDom.Compiler.CodeGeneratorOptions options = new System.CodeDom.Compiler.CodeGeneratorOptions(); options.BracingStyle = "C"; System.CodeDom.Compiler.CodeDomProvider codeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("C#"); System.CodeDom.Compiler.IndentedTextWriter textWriter = new System.CodeDom.Compiler.IndentedTextWriter(new System.IO.StreamWriter(outputFile)); codeDomProvider.GenerateCodeFromCompileUnit(generator.TargetCompileUnit, textWriter, options); textWriter.Close();
另请参阅
- Metadata
- 入门