E quem disse que o WCF não tem limite?

Comments
.net c# wcf
17 May 2008

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:

  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çoes abaixo. No entanto nao sei porque (e nem vou saber, porque no momento a opçao 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 já exista, adicione o dentro da existente.

     <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! :)


<< O profissional barriga verde...
O papel do Arquiteto...>> 
comments powered by Disqus
tucaz

tucaz

.NET Software Developer
About
All Posts
RSS
@tucaz
GitHub