Служба WCF - ограничения размера массива - PullRequest
2 голосов
/ 06 марта 2012

У меня есть метод службы 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>

1 Ответ

0 голосов
/ 06 марта 2012

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

<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 .Вы получите хорошее представление обо всех ошибках и о том, что было на самом деле во время обработки сообщения.

...