2010-03-25 3 views
11

Ich erhalte die folgende Ausnahme, wenn ich versuche, ein DTO über WCF-Dienste zu übergeben.WCF Maximale Lesetiefe Ausnahme

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 

Die app.config Bindung sieht wie folgt aus

<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 Service Verhalten:

Und die DTO sieht wie folgt aus:

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

Alle Hilfe würde so geschätzt werden wie ich bin zieh meine Haare damit aus.

+1

Haben Sie sowohl die Konfiguration geändert auf Client und Server? Ich habe den Eindruck, dass ich diese Änderung bei beiden vorher abgleichen musste. –

+1

Ziemlich ungewöhnlich, um so tief zu nisten. Sie könnten einen Zirkelverweis haben. Ich denke, wir müssen mehr von diesem DTO sehen; Ändern der maximalen Verschachtelung kann nur eine Pflaster-Lösung sein. – Aaronaught

+0

Ich löste mein Problem, wie ich hier erklärte: http://stackoverflow.com/questions/5537794/error-while-deserializing-the-object-in-wcf – Adi

Antwort

21

Es gibt eine Einstellung maxDepth auf dem <readerQuotas> aufgerufen, die Sie sollten auf einen höheren Wert als 32 festlegen können (die Standard). Sie haben dies natürlich bereits auf dem Client eingestellt (bis maxDepth = 200), aber Sie müssen dies auch auf der Serverseite tun - andernfalls wird der kleinere der beiden Werte (zwischen Client und Server) die reelle Nummer definieren, die verwendet wird.

Stellen Sie sicher, dass Server-Seite enthält auch diese Zeilen in seiner wsHttpBinding Konfiguration:

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

Ich hatte das gleiche Problem und ich löste es mit dieser Lösung !! Danke .. –

+0

readerQuotas ist ein Knoten der Bindung. so dass die web.config sollte wie folgt sein: \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t

5

Sie haben sowohl die Bindungskonfiguration ändern auf dem Client und dem Server entsprechen ...

Verwandte Themen