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


Как настроить пользовательскую привязку для обмена WS-Metadata

В этой теме описывается, как настроить пользовательскую привязку WS-Metadata Exchange. Windows Communication Foundation (WCF) содержит четыре определенных системой привязки метаданных, однако предусмотрена возможность публикации метаданных с помощью любой привязки. В этой теме рассказывается, как опубликовать метаданные с помощью wsHttpBinding. Эта привязка позволяет предоставлять метаданные безопасным способом. Код в этой статье основан на коде в разделе Образец для начала работы.

Использование файла конфигурации

  1. В файле конфигурации службы добавьте поведение службы, содержащее тег serviceMetadata:

    <behaviors>
       <serviceBehaviors>
         <behavior name="CalculatorServiceBehavior">
           <serviceMetadata httpGetEnabled="True"/>
         </behavior>
       </serviceBehaviors>
    </behaviors>
    
  2. Добавьте в тег службы, ссылающийся на новое поведение, атрибут behaviorConfiguration:

    <service        name="Microsoft.ServiceModel.Samples.CalculatorService"
    behaviorConfiguration="CalculatorServiceBehavior"> 
    
  3. Добавьте конечную точку метаданных, указав mex в качестве адреса, wsHttpBinding как привязку и IMetadataExchange как контракт:

    <endpoint address="mex"
              binding="wsHttpBinding"
              contract="IMetadataExchange" />
    
  4. Чтобы проверить правильность работы конечной точки обмена метаданными, добавьте тег конечной точки в файл конфигурации клиента:

    <endpoint name="MyMexEndpoint"               address="https://localhost:8000/servicemodelsamples/service/mex"
              binding="wsHttpBinding"
              contract="IMetadataExchange"/>
    
  5. В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как true, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:

    string mexAddress = "https://localhost:8000/servicemodelsamples/service/mex";
    
    MetadataExchangeClient mexClient = new MetadataExchangeClient("MyMexEndpoint");
    mexClient.ResolveMetadataReferences = true;
    MetadataSet mdSet = mexClient.GetMetadata(new EndpointAddress(mexAddress));
    foreach (MetadataSection section in mdSet.MetadataSections)
    Console.WriteLine("Metadata section: " + section.Dialect.ToString());
    

Настройка кодом

  1. Создайте экземпляр привязки WsHttpBinding:

    WSHttpBinding binding = new WSHttpBinding();
    
  2. Создайте экземпляр ServiceHost:

    ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
  3. Добавьте конечную точку службы и экземпляр ServiceMetadataBehavior:

    serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, baseAddress);
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    serviceHost.Description.Behaviors.Add(smb);
    
  4. Добавьте конечную точку обмена метаданными, указав ранее созданную WSHttpBinding:

    serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, mexAddress);
    
  5. Чтобы проверить правильность работы конечной точки обмена метаданными, добавьте тег конечной точки в файл конфигурации клиента:

    <endpoint name="MyMexEndpoint"               address="https://localhost:8000/servicemodelsamples/service/mex"
              binding="wsHttpBinding"
              contract="IMetadataExchange"/>
    
  6. В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как true, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:

    string mexAddress = "https://localhost:8000/servicemodelsamples/service/mex";
    
    MetadataExchangeClient mexClient = new MetadataExchangeClient("MyMexEndpoint");
    mexClient.ResolveMetadataReferences = true;
    MetadataSet mdSet = mexClient.GetMetadata(new EndpointAddress(mexAddress));
    foreach (MetadataSection section in mdSet.MetadataSections)
    Console.WriteLine("Metadata section: " + section.Dialect.ToString());
    

См. также

Задачи

Поведение публикации метаданных
Извлечение метаданных

Основные понятия

Метаданные
Публикация метаданных
Публикация конечных точек метаданных