2010-03-25 8 views
11

Otrzymuję następujący wyjątek podczas próby przekazania usługi DTO nad usługami WCF.Maksymalna głębokość odczytu głębokości odczytu WCF

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 

wiążące app.config wygląda zachowanie usług

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

A DTO wygląda następująco:

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

Wszelkie pomoc byłaby doceniona jak ja Wyciągając z niego moje włosy.

+1

Czy zmieniłeś konfigurację zarówno klienta, jak i serwera? Mam wrażenie, że musiałem wcześniej dopasować tę zmianę do obu. –

+1

Całkiem nietypowe, że zagnieżdżanie jest tak głębokie. Możesz mieć odwołanie cykliczne. Myślę, że musimy zobaczyć więcej tego DTO; zmiana maksymalnego zagnieżdżenia może być jedynie rozwiązaniem wspomagającym zespół. – Aaronaught

+0

Rozwiązałem mój problem, jak wyjaśniłem tutaj: http://stackoverflow.com/questions/5537794/error-while-deserializing-the-object-in-wcf – Adi

Odpowiedz

21

Jest to ustawienie nazywa maxDepth na <readerQuotas> które powinny być w stanie ustawić na wyższą wartość niż 32 (the domyślna). Oczywiście ustawiłeś to już na kliencie (na maxDepth = 200), ale musisz to zrobić również po stronie serwera - w przeciwnym razie mniejsza z dwóch wartości (między klientem a serwerem) będzie definiować używaną liczbę rzeczywistą.

Upewnij się, że po stronie serwera obejmuje również te linie w jego konfiguracji wsHttpBinding:

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

Miałem ten sam problem i rozwiązałem go, używając tego rozwiązania !! dzięki .. –

+0

readerQuotas jest węzłem wiązania. tak web.config powinno być jak poniżej: \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t

5

Musisz zmienić konfigurację wiązania zarówno na kliencie i na serwerze, aby dopasować ...