Introdução

Ao trabalhar com Windows Communication Foundation (WCF) em C#, os desenvolvedores frequentemente precisam acessar configurações específicas definidas no arquivo App.config de suas aplicações. Um requisito comum é acessar as configurações system.serviceModel. No entanto, muitos encontram problemas onde a seção esperada retorna nula ao ser acessada via ConfigurationManager. Este post de blog aborda esse problema e fornece uma solução detalhada.

O Problema

O desafio decorre da forma como a configuração do modelo de serviço WCF é estruturada. Os desenvolvedores podem notar que, ao tentar recuperar a seção system.serviceModel usando o seguinte código:

var serviceModelSection = ConfigurationManager.GetSection("system.serviceModel");

eles recebem null. No entanto, ao consultar uma seção diferente, como appSettings, funciona perfeitamente:

var appSettingsSection = ConfigurationManager.GetSection("appSettings");

O problema indica que há uma compreensão errônea sobre como as seções de configuração são carregadas em aplicações WCF.

Solução

Para carregar com sucesso a seção de configuração system.serviceModel, você precisa utilizar uma abordagem diferente. Aqui está como fazer isso:

Entendendo Grupos de Configuração

O elemento system.serviceModel no arquivo de configuração representa um grupo de seção de configuração, não apenas uma seção. Essa distinção é crucial porque tentar acessá-lo usando ConfigurationManager.GetSection não produzirá os resultados desejados.

Usando o Método Correto

Em vez de buscar a seção diretamente, você deve usar a classe ServiceModelSectionGroup para recuperar o grupo de seção inteiro:

var serviceModelGroup = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
  • Passo 1: Chame GetSectionGroup() em ServiceModelSectionGroup, passando a configuração atual da sua aplicação.
  • Passo 2: Acesse as configurações específicas do serviceModelGroup retornado.

Exemplo: Acessando o Endereço do Endpoint do Serviço

Aqui está um exemplo de como você poderia extrair o endereço do endpoint do serviço a partir da configuração:

var serviceModelGroup = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));

if (serviceModelGroup != null)
{
    var endpointAddress = serviceModelGroup.Client.Endpoints[0].Address.ToString();
    Console.WriteLine($"Endereço do Endpoint do Serviço: {endpointAddress}");
}
else
{
    Console.WriteLine("ServiceModelSectionGroup é nulo.");
}

Principais Conclusões

  • Sempre lembre-se de que system.serviceModel é um grupo de seção, não apenas uma seção.
  • Use ServiceModelSectionGroup.GetSectionGroup() para recuperar a configuração WCF.
  • Essa abordagem evita quaisquer hacks potenciais envolvendo carregamento manual do arquivo de configuração ou XPath.

Conclusão

Acessar a configuração system.serviceModel em uma aplicação C# .NET pode ser simples uma vez que você entenda a estrutura das seções e grupos de configuração. Ao utilizar o ServiceModelSectionGroup, você pode recuperar as configurações WCF necessárias sem encontrar referências nulas. Este método oferece uma solução mais limpa e robusta para lidar com a configuração WCF dentro de suas aplicações.

Para mais detalhes, consulte a documentação oficial em Microsoft Docs.

Boa codificação!