Mi sono imbattuto in uno strano malfunzionamento di un servizio WCF che fornisce dati ad un client Silverlight.
Il malfunzionamento si manifestava al momento della deserializzazione da parte del servizio di un grafo di entità di tipo Self-Tracking Entity (STE) di Entity Framework. L'errore che veniva ritornato al client era un anonimo "Not found" ma andando ad analizzare il file di trace del servizio WCF, l'errore che veniva rilevato era il seguente:
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter DocumentiFiscaliService:documento. The InnerException message was 'There was an error deserializing the object of type FarmaSpadEntities.DocumentoFiscale. The maximum read depth (32) has been exceeded because XML data being read has more levels of nesting than is allowed by the quota. This quota may be increased by changing the MaxDepth property on the XmlDictionaryReaderQuotas object used when creating the XML reader.
In pratica, il servizio riceveva un grafo di entity che come profondità superava la soglia di default, impostata al valore 32. Per poter aumentare questo valore si deve modificare il web.config del servizio WCF, aggiungendo il tag readerQuota con l'attributo maxDepth come indicato qua sotto:
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<readerQuotas maxDepth="2000"/>
</binding>
</basicHttpBinding>
</bindings>
Il problema però era che l'errore continuava a presentarsi, come se la modifica alla configurazione del binding non venisse caricata al momento della costruzione del servizio WCF.
Analizzando il file di trace del servizio, mi imbattevo in questo strano messaggio di warning:


Dopo qualche test ho scoperto che c'era un errore nella definizione dei service nel file web.config che però non veniva rilevato nè da Visual Studio, nè notificato al momento dell'esecuzione. L'errore era dovuto al fatto che il nome che si assegna al tag SERVICES deve coincidere con il nome completo della classe che implementa il servizio WCF.
<services>
<service name="FarmaciWcfService.FarmaciWcfService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="FarmaciWcfService.IArticoliService"></endpoint>
........
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
Nel mio caso, il servizio WCF è implementato dalla classe seguente:
namespace FarmaciWcfService
{
public class FarmaciWcfService : IArticoliService, .......
{
// codice....
}
}
e quindi è necessario che il tag SERVICE abbia lo stesso nome nel valore dell'attributo name.
Con quest'ultima modifica, il problema iniziale è scomparso (indicando che ora la nuova configurazione del binding viene effettivamente utilizzata) ed è scomparso anche il messaggio di warning nel file di traccia del servizio.