Сбой вызова службы WCF из-за передачи слишком большого количества данных?

У меня есть служба WCF, которую я написал на С#, которая передает вызывающей стороне (приложению C# WPF) коллекцию созданных объектов. Работает отлично, однако, если коллекция, которую я возвращаю, содержит слишком много объектов, вызов завершается ошибкой на стороне клиента примерно через 10 секунд с общим исключением (которое само содержит серию общих внутренних исключений). Вот исключение и внутренние исключения:

{"Произошла ошибка при получении ответа HTTP на http://myserver/MyAppService/MyAppService.svc. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что контекст HTTP-запроса прерывается сервером (возможно, из-за закрытия службы). Дополнительные сведения см. в журналах сервера."}< br> {"Базовое соединение было закрыто: произошла непредвиденная ошибка при получении."}
{"Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом."}
{"Существующее соединение было принудительно закрыто удаленным хостом"}

Проблема воспроизводится на 100% и определенно связана с размером коллекции, а не с содержимым. Я знаю это, потому что, если я разобью одну коллекцию на несколько меньших коллекций и передам их по одной, все будет работать нормально. Только когда они все вместе и коллекция слишком большая, это проблема.

Я попытался увеличить свойство maxReceivedMessageSize в файле app.config на стороне клиента до 2147483647, но ошибка все еще сохраняется. Также пытался увеличить период ожидания, но безрезультатно. Вот свойства в файле app.config. Я пытался увеличить почти каждое число ниже до 2147483647 и попытался изменить maxBufferPoolSize на 0, но безуспешно:

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_iMyAppService" 
         closeTimeout="01:00:00" openTimeout="01:00:00" 
         receiveTimeout="01:00:00" sendTimeout="01:00:00"
         allowCookies="false" bypassProxyOnLocal="false" 
         hostNameComparisonMode="StrongWildcard"
         maxBufferSize="2147483647" maxBufferPoolSize="524288" 
         maxReceivedMessageSize="2147483647"
         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>
  </basicHttpBinding>
  <wsHttpBinding>
    <binding name="WSHttpBinding_iMyAppService" 
         closeTimeout="00:01:00" openTimeout="00:01:00" 
         receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" transactionFlow="false" 
         hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
      <readerQuotas 
           maxDepth="32" 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="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
          algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint name="CurrencyConvertorSoap" 
      address="http://www.webservicex.net/CurrencyConvertor.asmx"
      binding="basicHttpBinding" 
      bindingConfiguration="CurrencyConvertorSoap"
      contract="CurrencyConverterService.CurrencyConvertorSoap" />

  <endpoint name="CurrencyConvertorSoap12" 
      address="http://www.webservicex.net/CurrencyConvertor.asmx"
      binding="customBinding" 
      bindingConfiguration="CurrencyConvertorSoap12"
      contract="CurrencyConverterService.CurrencyConvertorSoap" />

  <endpoint name="WSHttpBinding_iMyAppService"
      address="http://myserver/MyAppService/MyAppService.svc"
      binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_iMyAppService"
      contract="MyAppService.iMyAppService" >
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>

  <endpoint name="BasicHttpBinding_iMyAppService" 
      address="http://myserver/MyAppService/MyAppService.svc"
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_iMyAppService"
      contract="MyAppService.iMyAppService" />
</client>

Что еще я могу изменить или добавить, чтобы это заработало?

Спасибо!


person Nullqwerty    schedule 17.02.2012    source источник


Ответы (2)


Это может быть maxitemsinobjectgraph. Включите трассировку wcf, вы должны увидеть там трассировку стека.

person Nick Ryan    schedule 17.02.2012
comment
Черт... Я действительно надеялся, что это будет, когда я прочитал ваш ответ, но, к сожалению, нет. Если только я не сделал это правильно. Но я добавил это в свой app.config: ‹behaviors› ‹endpointBehaviors› ‹behavior name=Behaviors.EndpointBehavior› ‹dataContractSerializer maxItemsInObjectGraph=2147483647 /› ‹/behavior› ‹/endpointBehaviors› ‹/behaviors› и затем это в строку моей конечной точки : behaviorConfiguration=Behaviors.EndpointBehavior Но опять же... к сожалению, не сработало. Та же ошибка. Спасибо за помощь. - person Nullqwerty; 18.02.2012
comment
Я не на своем ПК, но я уверен, что вам нужно выполнить настройки на хосте и клиенте? Вы пробовали это (это было бы то же самое для настройки @felan). - person Nick Ryan; 18.02.2012
comment
Я попробовал предложение Фелана, но, к сожалению, это не помогло. Я попытался добавить поведение для maxitemsinobjectgraph в web.config на стороне сервера, но это не помогло. Я не мог добавить Felan's на стороне сервера, потому что в web.config нигде не было этих опций, поэтому я не знал, куда их поместить. - person Nullqwerty; 18.02.2012
comment
Получил Фелана и на стороне сервера, следуя примерам. Тем не менее, получить ошибку. - person Nullqwerty; 18.02.2012
comment
Понял... Наконец. Проблема заключалась в том, что в файле web.config на стороне сервера поведение maxItemsInObjectGraph должно было быть поведением службы, а не поведением конечной точки, как у меня было. Спасибо - person Nullqwerty; 23.02.2012

Насколько я помню, раньше мне приходилось увеличивать maxArrayLength в похожей ситуации.

person Felan    schedule 17.02.2012
comment
Я попытался увеличить его до 2147483647, но получил ту же ошибку. Спасибо, в любом случае. - person Nullqwerty; 18.02.2012
comment
Возможно, вам также придется увеличить maxStringContentLength=8192, и я бы не стал делать maxArrayLength таким большим. - person Felan; 18.02.2012
comment
Пробовал... не идет, к сожалению. Спасибо хоть. - person Nullqwerty; 18.02.2012