E quem disse que o WCF não tem limite?
Apesar de ter estudado bastante, feito alguns POCs e lido Inside Windows Communication Foundation inteiro (é, nem eu acredito), desde que comecei a trabalhar com WCF em aplicações grandes de verdade, que não tinham como objetivo servir apenas um departamento de 50 usuários, estou me sentindo meio barriga verde…
Hoje foi mais um dos momentos (em uma outra oportunidade eu coloco os outros) em que a coisa quase deu m****! Por uma série de motivos decidimos constuir em um único serviço WCF todas as funcionalidades de um determinado módulo do sistema. Sendo assim, o serviço está hoje com 63 método e crescendo… No entanto, qual foi a surpresa quando decidi atualizar a referência para o serviço após muda-lo novamente?
“The maximum nametable character count quota (16384) has been exceeded while reading XML data. The nametable is a data structure used to store strings encountered during XML processing – long XML documents with non-repeating element names, attribute names and attribute values may trigger this quota. This quota may be increased by changing the MaxNameTableCharCount property on the XmlDictionaryReaderQuotas object used when creating the XML reader”
Ou seja, ferrou! A equipe de desenvolvimento ficou quase 2 horas “semi-parada” esperando a resolução do problema. Depois de pesquisar bastante ainda não tinha achado uma solução que fosse satisfatória para o problema. Na prática, o problema acontece pois o XMLDictionary, por padrão, não consegue armazenar mais do que o valor default de chaves/valor referentes ao XML gerado pelo MEX/WSDL do WCF.
Algumas das soluções apresentadas envolviam gerar o proxy do WCF diretamente através do svcutil.exe ou até mesmo em runtime! Para atualizações feitas de tempos em tempos até acredito que a utilização do svcutil.exe diretamente não é problema, mas no meio do desenvolvimento é um parto!
No final, juntando alguns posts em blogs e msdn consegui chegar a solução que me servia: Criar um arquivo de configuração para o svcutil.exe com um bindind customizado aumentando esse limite. Existem duas formas de fazer:
1) Criar um arquivo svcutil.exe.config no diretório padrão onde o svcutil.exe está (geralmente dentro de \Program Files\Microsoft Visual Studio 9.0\) contendo as configurações abaixo. No entanto não sei porque (e nem vou saber, porque no momento a opção 2 resolve pra mim) meu svcutil.exe se encontra no diretório do framework e se eu colocar o arquivo.config lá quando o VS2008 chamar o svcutil.exe por trás dos panos o arquivo.config não é carregado.
2) Modificar o machine.config (geralmente dentro de \WINDOWS\Microsoft.NET\Framework\v2.0.50727) adicionando as chaves abaixo.
Caso a chave <client> já exista, adicione o <endpoint> dentro da existente.
E é isso! Reiniciar o VS2008 e mandar atualizar a referência ao serviço monstro! Tudo funcionando bonitinho
Espero que daqui pra frente os sustos diminuam…
Posted in: .NET, Desenvolvimento, WCF.
Tagged: .NET · C# · WCF