Como: publicar metadados para um serviço usando um arquivo de configuração

Este é um dos dois tópicos de instruções que demonstram a publicação de metadados para um serviço Windows Communication Foundation (WCF). Há duas maneiras de especificar como um serviço deve publicar metadados, usando um arquivo de configuração e usando código. Este tópico mostra como publicar metadados para um serviço usando um arquivo de configuração.

Cuidado

Este tópico mostra como publicar metadados de maneira não segura. Qualquer cliente pode recuperar os metadados do serviço. Se você precisar que seu serviço publique metadados de maneira segura, consulte Ponto de extremidade de metadados seguro personalizado.

Para obter mais informações sobre como publicar metadados em código, consulte Como: publicar metadados para um serviço usando código. A publicação de metadados permite que os clientes recuperem os metadados usando uma solicitação WS-Transfer GET ou uma solicitação HTTP/GET usando a cadeia de caracteres de consulta ?wsdl. Para ter certeza de que o código está funcionando, crie um serviço WCF básico. Para simplificar, um serviço auto-hospedado básico é fornecido no código a seguir.

using System;  
using System.Runtime.Serialization;  
using System.ServiceModel;  
using System.ServiceModel.Description;  
  
namespace Metadata.Samples  
{  
    [ServiceContract]  
    public interface ISimpleService  
    {  
        [OperationContract]  
        string SimpleMethod(string msg);  
    }  
  
    class SimpleService : ISimpleService  
    {  
        public string SimpleMethod(string msg)  
        {  
            Console.WriteLine("The caller passed in " + msg);  
            return "Hello " + msg;  
        }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));
            try  
            {  
                // Open the service host to accept incoming calls  
                host.Open();  
  
                // The service can now be accessed.  
                Console.WriteLine("The service is ready.");  
                Console.WriteLine("Press <ENTER> to terminate service.");  
                Console.WriteLine();  
                Console.ReadLine();  
  
                // Close the ServiceHostBase to shutdown the service.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  

Este serviço é um serviço auto-hospedado, que é configurado usando um arquivo de configuração. O arquivo de configuração a seguir serve como ponto de partida.

<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="Metadata.Example.SimpleService">  
        <endpoint address=""  
                  binding="basicHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
      </service>  
    </services>  
    <behaviors>  
  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Para publicar metadados para um serviço WCF usando um arquivo de configuração de aplicativo

  1. Dentro do arquivo App.config, após o fechamento do elemento </services>, crie um elemento <behaviors>.

  2. Dentro do elemento <behaviors>, adicione um elemento <serviceBehaviors>.

  3. Adicione um elemento <behavior> ao elemento <serviceBehaviors> e especifique um valor para o atributo name do elemento <behavior>.

  4. Adicione um elemento <serviceMetadata> ao elemento <behavior>. Defina o atributo httpGetEnabled como true e o atributo policyVersion como Policy15. httpGetEnabled permite que o serviço responda a solicitações de metadados feitas por uma solicitação HTTP GET. policyVersion informa ao serviço para estar em conformidade com WS-Policy 1.5 ao gerar metadados.

  5. Adicione um atributo behaviorConfiguration ao elemento <service> e especifique o atributo name do elemento <behavior> adicionado na etapa 1, conforme mostrado no exemplo de código a seguir.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. Adicione um ou mais elementos <endpoint> com o contrato definido como IMetadataExchange, conforme mostrado no exemplo de código a seguir.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
    
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
    
        <endpoint address="mex"  
                  binding="mexHttpBinding"  
                  contract="IMetadataExchange" />  
      </service>  
    </services>  
    
  7. Para os pontos de extremidade de metadados adicionados na etapa anterior, defina o atributo binding como um dos seguintes:

    • mexHttpBinding para publicação HTTP.

    • mexHttpsBinding para publicação HTTPS.

    • mexNamedPipeBinding para publicação de pipe nomeado.

    • mexTcpBinding para publicação TCP.

  8. Para os pontos de extremidade de metadados adicionados em uma etapa anterior, defina o endereço igual a:

    • Uma cadeia de caracteres vazia para usar o endereço base do aplicativo host como o ponto de publicação se o endereço base for o mesmo que a associação de metadados.

    • Um endereço relativo se o aplicativo host tiver um endereço base.

    • Um endereço absoluto.

  9. Crie e execute o aplicativo de console.

  10. Navegue até o endereço base do serviço (http://localhost:8001/MetadataSample neste exemplo) e verificar se a publicação de metadados está ativada. Caso contrário, uma mensagem na parte superior da página resultante será exibida: "A publicação de metadados para este serviço está desativada no momento".

Usar pontos de extremidade padrão

  1. Para configurar metadados em um serviço que usa pontos de extremidade padrão, especifique o ServiceMetadataBehavior no arquivo de configuração como no exemplo anterior, mas não especifique nenhum ponto de extremidade. O arquivo de configuração ficaria assim.

    <configuration>  
      <system.serviceModel>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="SimpleServiceBehavior">  
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
    
      </system.serviceModel>  
    </configuration>  
    

    Como o serviço tem um ServiceMetadataBehavior com o httpGetEnabled definido como true, o serviço tem metadados de publicação habilitados e, como nenhum ponto de extremidade foi adicionado explicitamente, o tempo de execução adiciona os pontos de extremidade padrão. Para obter mais informações sobre pontos de extremidade, associações e comportamentos padrão, confira Configuração simplificada e Configuração simplificada para serviços WCF.

Exemplo

O exemplo de código a seguir mostra a implementação de um serviço WCF básico e o arquivo de configuração que publica metadados para o serviço.

using System;  
using System.Runtime.Serialization;  
using System.ServiceModel;  
using System.ServiceModel.Description;  
  
namespace Metadata.Samples  
{  
    [ServiceContract]  
    public interface ISimpleService  
    {  
        [OperationContract]  
        string SimpleMethod(string msg);  
    }  
  
    class SimpleService : ISimpleService  
    {  
        public string SimpleMethod(string msg)  
        {  
            Console.WriteLine("The caller passed in " + msg);  
            return "Hello " + msg;  
        }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));
            try  
            {  
                // Open the service host to accept incoming calls  
                host.Open();  
  
                // The service can now be accessed.  
                Console.WriteLine("The service is ready.");  
                Console.WriteLine("Press <ENTER> to terminate service.");  
                Console.WriteLine();  
                Console.ReadLine();  
  
                // Close the ServiceHostBase to shutdown the service.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
          <serviceDebug includeExceptionDetailInFaults="False" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Confira também