Поделиться через


Практическое руководство. Импорт метаданных в конечные точки службы

В этом разделе объясняется, как импортировать метаданные в коллекцию конечных точек службы и использовать службу, определенную в разделе " Начало работы". Кроме того, в этом разделе демонстрируется создание клиентского приложения, импортирующего метаданные из службы, а затем вызывающего в службе метод Add.

Импорт метаданных в конечные точки службы

  1. Объявите объект EndpointAddress и инициализируйте его с помощью универсального кода ресурса (URI) для адреса обмена метаданными (MEX) этой службы.

    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
    
  2. Создайте клиент MetadataExchangeClient, передающий адрес MEX, и вызовите метод GetMetadata. Это позволяет извлечь метаданные из службы.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaSet = mexClient.GetMetadata();
    
  3. Создайте устройство импорта WsdlImporter, передающее ранее извлеченные метаданные, и вызовите метод ImportAllContracts. Эти действия позволяют создать коллекцию объектов ContractDescription. В зависимости от потребностей также можно было вызвать метод ImportAllEndpoints или ImportAllBindings

    WsdlImporter importer = new WsdlImporter(metaSet);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
    

    Примечание.

    После импорта метаданных невозможно будет создать клиентский канал или экспортировать метаданные. Это объясняется тем, что на данном этапе не имеется никакой информации о типе. Информация о типе требуется для фактического взаимодействия со службой или экспорта метаданных. Для создания сведений о типе необходимо создать код, показанный в шагах 4 и 5. Кроме того, можно использовать вспомогательный класс MetadataResolver. Дополнительные сведения см. в разделе "Практическое руководство. Использование MetadataResolver для динамического получения метаданных привязки".

  4. Создайте информацию о типе для каждого контракта.

    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.");
    
  5. Теперь этой информацией можно пользоваться. В следующем примере кода создается исходный код 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();
    

См. также