Partilhar via


Configurando serviços WCF no código

O Windows Communication Foundation (WCF) 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 após ser implantado. Ao usar arquivos de configuração, um profissional de TI só precisa atualizar o arquivo de configuração, nenhuma recompilação é necessária. Os arquivos de configuração, no entanto, podem ser complexos e difíceis de manter. Não há suporte para depuração de arquivos de configuração e os elementos de configuração são referenciados por nomes, o que torna a criação de arquivos de configuração propensa a erros e difícil. WCF também permite que você configure serviços em código. Em versões anteriores do WCF (4.0 e anteriores) configurar serviços em código era fácil em cenários auto-hospedados, a ServiceHost classe permitia configurar pontos de extremidade e comportamentos antes de chamar ServiceHost.Open. Em cenários hospedados na Web, no entanto, você não tem acesso direto à ServiceHost classe. Para configurar um serviço hospedado na Web, era necessário criar um System.ServiceModel.ServiceHostFactory que criasse e executasse qualquer ServiceHostFactory configuração necessária. A partir do .NET Framework 4.5, o WCF fornece uma maneira mais fácil de configurar serviços auto-hospedados e hospedados na Web em 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 de serviço:

public static void Configure(ServiceConfiguration config)

O método Configure usa uma ServiceConfiguration instância que permite ao desenvolvedor adicionar pontos de extremidade e comportamentos. Esse método é chamado pelo WCF antes que o host de serviço seja aberto. Quando definidas, quaisquer definições de configuração de serviço especificadas em um arquivo app.config ou web.config serão ignoradas.

O trecho de código a seguir ilustra como definir o Configure método 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 usa o protocolo ou pode adicionar automaticamente pontos de extremidade 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 <protocolMappings> seção só são usadas se nenhum ponto de extremidade do aplicativo for adicionado ao ServiceConfiguration programaticamente. Opcionalmente, você pode carregar a configuração do serviço a partir do arquivo de configuração do aplicativo padrão chamando LoadFromConfiguration e alterando as configurações. A LoadFromConfiguration() classe também permite que você carregue a configuração a partir de uma configuração centralizada. O código a seguir 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 <host> configurações dentro da <service> <system.serviceModel>tag de . Conceitualmente, <host> trata-se de configuração de host, não de configuração de serviço, e ele é carregado antes que o método Configure seja executado.

Consulte também