Compartilhar via


Como: configurar uma associação personalizada do WS-Metadata Exchange

Este artigo explica como configurar uma associação de WS-Metadata Exchange personalizada. O Windows Communication Foundation (WCF) inclui quatro associações de metadados definidas pelo sistema, mas você pode publicar metadados usando qualquer associação que quiser. Este artigo mostra como publicar metadados usando o wsHttpBinding. Essa associação oferece a opção de expor metadados de maneira segura. O código neste artigo é baseado na Introdução.

Usar um arquivo de configuração

  1. No arquivo de configuração do serviço, adicione um comportamento de serviço que contenha a marca serviceMetadata:

    <behaviors>  
       <serviceBehaviors>  
         <behavior name="CalculatorServiceBehavior">  
           <serviceMetadata httpGetEnabled="True"/>  
         </behavior>  
       </serviceBehaviors>  
    </behaviors>  
    
  2. Adicione um atributo behaviorConfiguration à marca de serviço que faz referência a esse novo comportamento:

    <service name="Microsoft.ServiceModel.Samples.CalculatorService"  
    behaviorConfiguration="CalculatorServiceBehavior" />
    
  3. Adicione um ponto de extremidade de metadados especificando o mex como o endereço, wsHttpBinding como a associação e IMetadataExchange como o contrato:

    <endpoint address="mex"  
              binding="wsHttpBinding"  
              contract="IMetadataExchange" />  
    
  4. Para verificar se o ponto de extremidade de troca de metadados está funcionando corretamente, adicione uma marca de ponto de extremidade no arquivo de configuração do cliente:

    <endpoint name="MyMexEndpoint"               address="http://localhost:8000/servicemodelsamples/service/mex"  
              binding="wsHttpBinding"  
              contract="IMetadataExchange"/>  
    
  5. No método Main() do cliente, crie uma nova instância MetadataExchangeClient, defina sua propriedade ResolveMetadataReferences como true, chame GetMetadata e, em seguida, itere por meio da coleção de metadados retornados:

    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());  
    

Configurando por código

  1. Crie uma instância de associação WSHttpBinding:

    WSHttpBinding binding = new WSHttpBinding();  
    
  2. Crie uma instância de ServiceHost:

    ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);  
    
  3. Adicione um ponto de extremidade de serviço e adicione uma instância ServiceMetadataBehavior:

    serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, baseAddress);  
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();  
    smb.HttpGetEnabled = true;  
    serviceHost.Description.Behaviors.Add(smb);  
    
  4. Adicione um ponto de extremidade de troca de metadados, especificando o WSHttpBinding criado anteriormente:

    serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, mexAddress);  
    
  5. Para verificar se o ponto de extremidade de troca de metadados está funcionando corretamente, adicione uma marca de ponto de extremidade no arquivo de configuração do cliente:

    <endpoint name="MyMexEndpoint"               address="http://localhost:8000/servicemodelsamples/service/mex"  
              binding="wsHttpBinding"  
              contract="IMetadataExchange"/>  
    
  6. No método Main() do cliente, crie uma nova instância MetadataExchangeClient, defina a propriedade ResolveMetadataReferences como true, chame GetMetadata e, em seguida, itere por meio da coleção de metadados retornados:

    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());  
    

Confira também