Configuração do cliente WCF: como posso verificar se o endpoint está no arquivo de configuração e no fallback do código, se não?
-
06-07-2019 - |
Pergunta
Procurando fazer um cliente que envie objetos de mensagem serializada de volta a um servidor via WCF.
Para facilitar as coisas para o desenvolvedor final (departamentos diferentes) que eles não precisavam saber como editar seu arquivo de configuração para configurar os dados do ponto final do cliente.
Dito isto, também seria brilhante que o endpoint também não estivesse incorporado/codificado no cliente.
Um cenário de mistura parece -me a solução mais fácil de lançar:
Se (descrito na configuração) use o arquivo de configuração mais fallback no terminal codificado.
O que eu descobri é:
new Client();
falha se nenhuma definição de arquivo de configuração foi encontrada.new Client(binding,endpoint);
funciona
Portanto:
Client client;
try {
client = new Client();
}catch {
//Guess not defined in config file...
//fall back to hard coded solution:
client(binding, endpoint)
}
Mas existe alguma maneira de Verifica (exceto tentar/capturar) para ver se o arquivo de configuração tem um terminal declarado?
O acima não falhará tão bem se definido no arquivo de configuração, mas não configurado, certo? Seria bom distinguir entre as duas condições?
Solução
Aqui está a maneira de ler o arquivo de configuração e carregar os dados em um objeto fácil de gerenciar:
Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSectionGroup csg = c.GetSectionGroup("system.serviceModel");
if (csg != null)
{
ConfigurationSection css = csg.Sections["client"];
if (css != null && css is ClientSection)
{
ClientSection cs = (ClientSection)csg.Sections["client"];
//make all your tests about the correcteness of the endpoints here
}
}
O objeto "CS" exporá uma coleção chamada "terminais" que permite acessar todas as propriedades que você encontra no arquivo de configuração.
Certifique -se de tratar também os ramos "else" dos "se" e os trate como casos de falha (a configuração é inválida).
Outras dicas
Eu gostaria de propor a versão aprimorada de Alexdrenea Solução, que usa apenas tipos especiais para seções de configuração.
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ServiceModelSectionGroup serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);
if (serviceModelGroup != null)
{
ClientSection clientSection = serviceModelGroup.Client;
//make all your tests about the correcteness of the endpoints here
}