Подтвердить что ты не робот

Максимальное исключение глубины чтения WCF

Я получаю следующее исключение при попытке передать 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
{

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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