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


Практическое руководство. Настройка пользовательской привязки для обмена WS-Metadata

В этой статье объясняется, как настроить настраиваемую привязку обмена метаданными WS. 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="http://localhost:8000/servicemodelsamples/service/mex"  
              binding="wsHttpBinding"  
              contract="IMetadataExchange"/>  
    
  5. В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как true, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:

    string mexAddress = "http://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="http://localhost:8000/servicemodelsamples/service/mex"  
              binding="wsHttpBinding"  
              contract="IMetadataExchange"/>  
    
  6. В методе клиента Main() создайте новый экземпляр MetadataExchangeClient, задайте его свойство ResolveMetadataReferences как true, вызовите GetMetadata, а затем выполните итерацию через коллекцию возвращенных метаданных:

    string mexAddress = "http://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());  
    

См. также