Muralidharan Subbian Ответов: 1

Максимальная глубина проблемой при отправке объектов в службе WCF


Я получаю приведенное ниже исключение при отправке объектов в службу WCF, может ли кто-нибудь помочь мне решить эту проблему.

Исключение:
Модуль форматирования выдал исключение при попытке десериализации сообщения: произошла ошибка при попытке десериализации параметра http://tempuri.org/:xxxx(объект класса). Сообщение InnerException гласило: "произошла ошибка десериализации объекта xxxxx.xx.xxx.xxxx(класс). Максимальная глубина чтения (200) была превышена, поскольку считываемые XML-данные имеют больше уровней вложенности, чем это разрешено квотой. Эта квота может быть увеличена путем изменения свойства MaxDepth объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML. Линия 2, позиция 59349. Пожалуйста, смотрите InnerException для получения более подробной информации.

Внутреннее Исключение:
Максимальная глубина чтения (200) была превышена, поскольку считываемые XML-данные имеют больше уровней вложенности, чем это разрешено квотой. Эта квота может быть увеличена путем изменения свойства MaxDepth объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML. Строка 2, позиция 59349.

Что я уже пробовал:

Я попробовал установить следующие readerQuotas в привязках как в клиенте, так и на сервере
<readerQuotas maxDepth="200" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />

Конфигурация Моей Службы:
<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <bindings>
      <basicHttpBinding>
        <binding name="secureHttpBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="200" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="mexBehavior" name="Service">
        <endpoint address="Service" binding="basicHttpBinding" bindingConfiguration="secureHttpBinding" contract="IService"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/Service"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

Конфигурация Моего Клиента:
<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="200" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:50259/Service.svc/Service"

        behaviorConfiguration="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"

        contract="IService" name="BasicHttpBinding_IService" />
    </client>
  </system.serviceModel>
Кроме того, я добавил maxRequestLength в httpRuntime как в конфигурации клиента, так и в конфигурации службы
<system.web>
    <httpRuntime targetFramework="4.6" maxRequestLength="2147483646"/>
</system.web>

1 Ответов

Рейтинг:
0

Richard Deeming

Цитата:
Максимальная глубина считывания (200) была превышена ...
<readerQuotas maxDepth="200" ...

Ошибка заключается в том, что вы говорите, что maxDepth он установлен на 200, и этого недостаточно.

Вам нужно установить maxDepth к более высокому значению.

Однако это похоже на смехотворно глубоко вложенный граф объектов для отправки запроса WCF. Вы должны дважды проверить данные, которые вы посылаете, чтобы увидеть, если вы можете уменьшить глубину.

Например, если вы отправляете связанный список, граф объектов будет таким же глубоким, как и количество элементов в вашем списке. Если вы превратили его в обычный List<T>, или массив, то граф объекта будет плоским.