WCF - Ошибка при попытке получить большой список данных (~ 5000 объектов) - PullRequest
3 голосов
/ 24 июня 2010

Я пытаюсь передать около 7000-8000 объектов, которые не являются большими (только 9 свойств на экземпляр объекта).Кто-нибудь знает, почему, когда я начинаю получать более 5000 или около того объектов, что я получаю ошибки подключения?Он отлично работает, пока не достигнет некоторого порогового значения для размера данных.

Я раскрываю извлечение этих объектов через привязку службы WCF TCP.У меня есть следующий пример конфигурации:

<bindings>
  <netTcpBinding>
    <binding name="NetTcpBindingConfig"
             openTimeout="00:01:00"
             sendTimeout="00:05:00"
             closeTimeout="00:01:00"
             maxBufferPoolSize="2147483647"
             maxBufferSize="2147483647"
             maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxBytesPerRead="2147483647"
                    maxNameTableCharCount="2147483647" />
      <security>
        <transport/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>

<services>
  <service behaviorConfiguration="ServiceBehavior"
           name="TestService">
    <endpoint address="" 
              binding="netTcpBinding" 
              bindingConfiguration="NetTcpBindingConfig"
              contract="ServiceInterfaces.ITestService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" 
              binding="mexTcpBinding" 
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8526/TestService" />
      </baseAddresses>
    </host>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="Services.ServiceBehavior">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Из моего кода .NET я вызываю службу, используя ChannelFactory со следующим примером кода:

using (ChannelFactory<ITestervice> channel = new ChannelFactory<ITestService>(BindingConfig, "net.tcp://localhost:8526/TestService"))
{
    ITestService testService = channel.CreateChannel();
    toReturn = testService.LoadAll();
    channel.Close();
}

Объект BindingConfig является свойством NetTcpBindingв моем коде, который заполняется как «новый NetTcpBinding (« NetTcpBindingConfig »)».Моя клиентская привязка точно такая же, как моя привязка службы WCF TCP.

Может ли кто-нибудь подсказать, как я могу получить все данные (кажется, мой максимальный лимит составляет ~ 5000 объектов с моей текущей настройкой)?Буду признателен за любую оказанную помощь.Спасибо.

РЕДАКТИРОВАТЬ: В случае, если кто-то сталкивается с этим, см. Принятое решение о MaxItemsInObjectGraph.Однако, если вы используете ChannelFactory из Клиента для использования ваших услуг, см. Следующий код, чтобы заставить его работать:

foreach (OperationDescription operation in channel.Endpoint.Contract.Operations)
{
    DataContractSerializerOperationBehavior dataContractBehavior = operation.Behaviors[typeof(DataContractSerializerOperationBehavior)] as DataContractSerializerOperationBehavior;

    if (dataContractBehavior != null)
        dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
}

1 Ответ

8 голосов
/ 24 июня 2010

Рассмотрите возможность увеличения квоты MaxItemsInObjectGraph (значение по умолчанию - 64 КБ). Это должно быть как на стороне сервера, так и на стороне клиента. Смотрите пример конфигурации:

alt text

...