Практическое руководство. Импорт метаданных в конечные точки службы
В этом разделе объясняется, как импортировать метаданные в коллекцию конечных точек службы и использовать службу, определенную в разделе " Начало работы". Кроме того, в этом разделе демонстрируется создание клиентского приложения, импортирующего метаданные из службы, а затем вызывающего в службе метод Add
.
Импорт метаданных в конечные точки службы
Объявите объект EndpointAddress и инициализируйте его с помощью универсального кода ресурса (URI) для адреса обмена метаданными (MEX) этой службы.
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();