2010-03-25 15 views
11

Obtengo la siguiente excepción al intentar pasar un DTO sobre los servicios de WCF.WCF Maximum Read Depth Exception

System.Xml.XmlException: 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. Line 1, position 5230. 
    at System.Xml.XmlExceptionHelper.ThrowXmlException 

miradas vinculantes El app.config como este comportamiento en servicio

<binding name="WSHttpBinding_IProjectWcfService" closeTimeout="00:10:00" 
     openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="524288" maxReceivedMessageSize="10240000" messageEncoding="Text" 
     textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="200" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
     <security mode="Message"> 

     <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""> 
      <extendedProtectionPolicy policyEnforcement="Never" /> 
     </transport> 
     <message clientCredentialType="UserName" negotiateServiceCredential="true" 
      algorithmSuite="Default" establishSecurityContext="true" /> 
     </security> 
    </binding> 

Web.config:

Y el DTO se ve así:

[Serializable] 
[DataContract(IsReference=true)] 
public class MyDto 
{ 

Cualquier ayuda sería apreciada ya que soy tirando de mi pelo con eso.

+1

¿Ha cambiado la configuración en el cliente y el servidor? Tengo la impresión de que tenía que hacer coincidir este cambio en ambos antes. –

+1

Bastante inusual para tener una anidación tan profunda. Puede tener una referencia circular. Estoy pensando que necesitamos ver más de ese DTO; cambiar la anidación máxima puede ser solo una solución de tirita. – Aaronaught

+0

He resuelto mi problema como expliqué aquí: http://stackoverflow.com/questions/5537794/error-while-deserializing-the-object-in-wcf – Adi

Respuesta

21

Hay un ajuste llamado maxDepth en el <readerQuotas> que debe ser capaz de establecer en un valor mayor que 32 (el defecto). Obviamente, ya ha establecido esto en el cliente (hasta maxDepth = 200), pero también debe hacerlo en el lado del servidor; de lo contrario, el menor de los dos valores (entre el cliente y el servidor) definirá el número real utilizado.

Asegúrese de que el lado del servidor también incluye estas líneas en su configuración wsHttpBinding:

<readerQuotas maxDepth="200" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
+1

¡Tuve el mismo problema y lo resolví con esta solución! gracias .. –

+0

readerQuotas es un nodo de enlace. por lo que el web.config debe ser como este: \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t

5

Hay que cambiar la configuración de enlace tanto en el cliente y el servidor para que coincida con ...