Исключение максимальной глубины чтения WCF - PullRequest
11 голосов
/ 25 марта 2010

При попытке передать DTO через службы 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

Привязка app.config выглядит следующим образом

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

    <behavior name="BehaviorConfiguration" >
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <dataContractSerializer maxItemsInObjectGraph="6553600" />
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" />
      <serviceCredentials>
        <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />

        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider"/>
      </serviceCredentials>
    </behavior>

И DTO выглядит так:

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

Буду признателен за любую помощь, так как я вырываю ей волосы.

Ответы [ 2 ]

21 голосов
/ 25 марта 2010

На <readerQuotas> есть настройка с именем maxDepth, которую вы должны установить на более высокое значение, чем 32 (по умолчанию). Очевидно, что вы уже установили это на клиенте (maxDepth = 200), но вам также нужно сделать это на стороне сервера - в противном случае меньшее из двух значений (между клиентом и сервером) будет определять реальное используемое число.

Убедитесь, что ваша серверная сторона также включает эти строки в свою конфигурацию wsHttpBinding:

<readerQuotas maxDepth="200" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
5 голосов
/ 25 марта 2010

Необходимо изменить конфигурацию привязки как на клиенте, так и на сервере, чтобы соответствовать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...