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 WCF (Windows Communication Foundation). 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.

Atenção

Este tópico mostra como publicar metadados de forma 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 seguros personalizados.

Para obter mais informações sobre como publicar metadados no 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 ?wsdl consulta. 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 seguinte arquivo de configuração 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 elemento de fechamento </services> , crie um <behaviors> elemento .

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

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

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

  5. Adicione um behaviorConfiguration atributo ao <service> elemento e especifique o name<behavior> atributo do elemento 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 <endpoint> elementos 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 binding atributo 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. Compile e execute a aplicação da consola.

  10. Navegue até o endereço base do serviço (http://localhost:8001/MetadataSample neste exemplo) e verifique 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á desabilitada no momento".

Para 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 padrão, associações e comportamentos, consulte 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>  

Consulte também