Compartilhar via


Configurando serviços WCF em código

O WCF (Windows Communication Foundation) permite que os desenvolvedores configurem serviços usando arquivos de configuração ou código. Os arquivos de configuração são úteis quando um serviço precisa ser configurado depois de ser implantado. Ao usar arquivos de configuração, um profissional de TI apenas precisa atualizar o arquivo de configuração, nenhuma recompilação é necessária. Os arquivos de configuração, porém, podem ser complexos e difíceis de manter. Não há suporte para depurar arquivos de configuração e os elementos de configuração são referenciados por nomes, o que torna os arquivos de configuração de criação sujeitos a erros e difíceis. O WCF também permite configurar serviços no código. Em versões anteriores do WCF (4.0 e anteriores), configurar serviços no código era fácil em cenários auto-hospedados, a classe ServiceHost permitia que você configurasse pontos de extremidade e comportamentos antes de chamar o ServiceHost.Open. Em cenários hospedados na Web, porém, você não tem acesso direto à classe ServiceHost. Para configurar um serviço Web hospedado, você precisava criar um System.ServiceModel.ServiceHostFactory que criou o ServiceHostFactory e executar qualquer configuração necessária. A partir do .NET Framework 4.5, o WCF fornece um modo mais fácil de configurar serviços auto-hospedados e hospedados na Web no código.

O método Configure

Basta definir um método estático público chamado Configure com a seguinte assinatura em sua classe de implementação do serviço:

public static void Configure(ServiceConfiguration config)

O método Configure usa uma instância ServiceConfiguration que permite que o desenvolvedor adicione pontos de extremidade e comportamentos. Esse método é chamado pelo WCF antes que o host de serviço seja aberto. Quando definido, todas as configurações do serviço especificadas em um arquivo app.config ou Web.config serão ignoradas.

O snippet de código a seguir ilustra como definir o método Configure e adicionar um ponto de extremidade de serviço, um comportamento de ponto de extremidade e comportamentos de serviço:

public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            ServiceEndpoint se = new ServiceEndpoint(new ContractDescription("IService1"), new BasicHttpBinding(), new EndpointAddress("basic"));
            se.Behaviors.Add(new MyEndpointBehavior());
            config.AddServiceEndpoint(se);

            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        }

        public string GetData(int value)
        {
            return $"You entered: {value}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

Para habilitar um protocolo como HTTPS para um serviço, você pode adicionar explicitamente um ponto de extremidade que use o protocolo ou adicionar pontos de extremidade automaticamente chamando ServiceConfiguration.EnableProtocol(Binding), que adiciona um ponto de extremidade para cada endereço base compatível com o protocolo e cada contrato de serviço definido. O código a seguir ilustra como usar o método ServiceConfiguration.EnableProtocol:

public class Service1 : IService1
{
    public string GetData(int value);
    public static void Configure(ServiceConfiguration config)
    {
        // Enable "Add Service Reference" support
       config.Description.Behaviors.Add( new ServiceMetadataBehavior { HttpGetEnabled = true });
       // set up support for http, https, net.tcp, net.pipe
       config.EnableProtocol(new BasicHttpBinding());
       config.EnableProtocol(new BasicHttpsBinding());
       config.EnableProtocol(new NetTcpBinding());
       config.EnableProtocol(new NetNamedPipeBinding());
       // add an extra BasicHttpBinding endpoint at http:///basic
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");
    }
}

As configurações na seção <protocolMappings> só serão usadas se nenhum ponto de extremidade de aplicativo for adicionado programaticamente ao ServiceConfiguration. Opcionalmente, você pode carregar a configuração de serviço do arquivo de configuração de aplicativo padrão chamando LoadFromConfiguration e, em seguida, alterar as configurações. A classe LoadFromConfiguration() também permite carregar a configuração a partir de uma configuração centralizada. O seguinte código ilustra como implementar isso:

public class Service1 : IService1
{
    public void DoWork();
    public static void Configure(ServiceConfiguration config)
    {
          config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"c:\sharedConfig\MyConfig.config" }, ConfigurationUserLevel.None));
    }
}

Importante

Observe que LoadFromConfiguration ignora as configurações <host> dentro da marca <service> de <system.serviceModel>. Conceitualmente, <host> trata-se da configuração do host, não da configuração do serviço, e ela é carregada antes da execução do método Configure.

Confira também