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çoes grandes de verdade, que nao 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çao do problema. Depois de pesquisar bastante ainda nao tinha achado uma soluçÎÎo que fosse satisfatória para o problema. Na prática, o problema acontece pois o XMLDictionary, por padrao, nao consegue armazenar mais do que o valor default de chaves/valor referentes ao XML gerado pelo MEX/WSDL do WCF. Algumas das soluçoes apresentadas envolviam gerar o proxy do WCF diretamente através do svcutil.exe ou até mesmo em runtime! Para atualizaçoes feitas de tempos em tempos até acredito que a utilizaçao do svcutil.exe diretamente nao é problema, mas no meio do desenvolvimento é um parto! No final, juntando alguns posts em blogs e msdn consegui chegar a soluçao que me servia: Criar um arquivo de configuraçao para o svcutil.exe com um bindind customizado aumentando esse limite. Existem duas formas de fazer:
Modificar o machine.config (geralmente dentro de \WINDOWS\Microsoft.NET\Framework\v2.0.50727) adicionando as chaves abaixo. Caso a chave
<system.serviceModel>
<bindings>
<custombinding>
<binding name="CustomSizeMex">
<textmessageencoding>
<readerquotas maxdepth="2147483647" maxstringcontentlength="2147483647" maxarraylength="2147483647" maxbytesperread="2147483647" maxnametablecharcount="2147483647">
</readerquotas></textmessageencoding> <httptransport maxreceivedmessagesize="2147483647" maxbuffersize="2147483647">
</httptransport></binding>
</custombinding>
</bindings>
<client>
<endpoint binding="customBinding" bindingconfiguration="CustomSizeMex" contract="IMetadataExchange" name="http"></endpoint>
</client>
</system.serviceModel>
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! :)