Служба WCF — ограничения размера массива

У меня есть метод службы WCF, который я реализовал, который получает IEnumerable

    [OperationContract]
    List<Item> GetItems(DateTime sinceDate, IEnumerable<Guid> idList);

Метод работает должным образом при передаче IEnumerable размером 1000 или меньше; служба возвращается с ожидаемым ответом. В какой-то момент переданный массив слишком велик (видно на 2000 элементов), и выдается System.ServiceModel.ProtocolException, "{"The remote server returned an unexpected response: (400) Bad Request."}"

Я не уверен, что управляет ограничением размера массива. Я знаю о разделе readerQuotas привязки, а для параметра maxArrayLength установлено значение по умолчанию 16384. Размер моего буфера достаточно велик, но я не уверен, почему вызов службы не работает. Есть ли ограничение на basicHttpBinding для переданных размеров массива? Что нужно изменить в моей конфигурации, чтобы я мог передавать большие массивы?

Вот мой app.config на стороне клиента. Серверная сторона эквивалентна.

<binding name="BasicHttpBinding_IMyService" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="20000000" maxBufferPoolSize="524288" maxReceivedMessageSize="20000000"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                  realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
</binding>

person Stealth Rabbi    schedule 06.03.2012    source источник
comment
Вы также пытались увеличить параметры тайм-аута, чтобы разрешить транспортировку всех этих данных? Посмотрите здесь msdn.microsoft.com/en-us/library/   -  person CheGueVerra    schedule 06.03.2012
comment
Вы установили свойство maxItemsInObjectGraph, как указано ниже? Также установите большие значения в readerQuotas. Убедитесь, что они установлены как на стороне клиента, так и на стороне сервера.   -  person Rajesh    schedule 06.03.2012


Ответы (1)


Вам необходимо зарегистрировать поведение службы, которое увеличивает максимальное количество объектов в графе:

<serviceBehaviors>
    <behavior name="IncreadedSizeBehavior">
      <dataContractSerializer maxItemsInObjectGraph="100000"/>
    </behavior>
  </serviceBehaviors>

Затем вам нужно зарегистрировать это поведение в вашей конечной точке:

<services>
    <service name="MyService" behaviorConfiguration="IncreadedSizeBehavior">
        <host />
        <endpoint />
</services>

Самое полезное при отладке проблем с wcf — включить ведение журнала ошибок трассировки:

<system.diagnostics>
        <trace autoflush="true" />
        <sources>
            <source name="System.ServiceModel"
                            switchValue="Error"
                            propagateActivity="true">
                <listeners>
                    <add name="sdt"
                            type="System.Diagnostics.XmlWriterTraceListener"
                            initializeData= "ErrorTrace.svclog"
                            />
                </listeners>
            </source>
        </sources>
    </system.diagnostics>

Затем откройте этот файл трассировки с помощью средства просмотра трассировки svc, загружаемого с помощью Windows SDK< /а>. Вы получаете хорошее представление обо всех ошибках и фактической ошибке при обработке сообщения.

person Oved D    schedule 06.03.2012
comment
Спасибо. При включенном ведении журнала ошибка указывает на проблему с максимальным количеством входящих сообщений: превышена квота на максимальный размер входящих сообщений (65536). Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize соответствующего элемента привязки. - person Stealth Rabbi; 06.03.2012
comment
Глядя на ваш образец, разве у вас не установлено значение 20000000? - person Oved D; 06.03.2012
comment
О, на самом деле ваш пример со стороны клиента, я думаю, вам нужно установить его и на стороне сервера. - person Oved D; 06.03.2012
comment
Да, мне пришлось установить MaxReceivedMessageSize на серверной стороне app.config. Установка maxItemsInObjectGraph была ненужной, но ваш ответ и комментарии, безусловно, привели меня туда, где мне нужно было быть. благодаря. - person Stealth Rabbi; 06.03.2012
comment
Так что дело не в том, что и клиент, и сервер должны были совпадать, а просто в том, что размер, который служба получала (отправляла от клиента), была больше, чем по умолчанию? - person Stealth Rabbi; 06.03.2012
comment
Да я бы так и подумал. Я msft устанавливает значение по умолчанию в качестве меры безопасности, чтобы предотвратить перегрузку службы массовым запросом. - person Oved D; 06.03.2012