Не могу отправлять большие сообщения через WCF

Я использую WCF для отправки всевозможных сообщений, и это сообщение в perticular составляет около 3200000 байт плюс некоторые строки и заголовки. Большой paylode - это сериализованный объект, полученный с хоста через другую службу, конфигурацию которой я пытался воспроизвести во всех аспектах.

Я использую связывание netTcp для производительности, и мы используем много обратных вызовов. Я установил все параметры, которые могу найти, на максимальный уровень как на стороне клиента, так и на стороне сервера.

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IEventMissionService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="None" />
    </binding>
    </bindings>
    <client>
      <endpoint address="net.tcp://localhost:7359/EventMissionMap" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IEventMissionService" contract="RXEventMissionMapService.IEventMissionService" name="NetTcpBinding_IEventMissionService" />
      </client>
  </system.serviceModel>

Я получаю это неописанное сообщение об ошибке на клиенте:

Разъем подключения был прерван. Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса. Тайм-аут локального сокета был '00:00:59.9979996'.

И внутреннее расширение:

Существующее соединение было принудительно закрыто удаленным хостом

Трассировка бега приносит немного больше информации (трассировка вершины стека):

System.ServiceModel.Channels.SocketConnection.Write (буфер Byte[], смещение Int32, размер Int32, немедленное логическое значение, время ожидания TimeSpan) Внутреннее расширение верхней части трассировки стека: System.Net.Sockets.Socket.Send(буфер Byte[], Int32 смещение, размер Int32, SocketFlags socketFlags)

Внутреннее исключение трассировки вершины стека:

System.Net.Sockets.Socket.Send (буфер в байтах [], смещение Int32, размер Int32, SocketFlags socketFlags)

Если я установлю полезную нагрузку на ноль (не отправляя объект 3,2 МБ), сообщение пройдет без суеты.

Может ли тот факт, что объект происходит из другого сервиса, как-то связан с моей проблемой? На мой взгляд, проблема в размере сообщения, но увеличение каких-либо опций в конфигурации мне пока не помогло.

Я попытался установить на клиента без удачи. Использование потоковой передачи приводит к переключению на запрос / ответ или удалению всех обратных вызовов...

Есть идеи?

1 ответ

Решение

Я был неправ!! Изменения, которые я сделал на уровнях конфигурации на стороне хоста, были в совершенно другом сервисе. Максимизация размеров буфера и размеров сообщений сделала свое дело! Я не совсем уверен, кто из них заставил это работать. Я могу только порекомендовать всем вам, у которых есть похожие проблемы, взглянуть на MaxBufferSize, MaxReceivedMessageSize, ReaderQuotas->MaxArrayLength и некоторые параметры времени ожидания как на стороне хоста, так и на стороне клиента. Также для максимизации maxItemsInObjectGraph в поведении службы на стороне хоста.

Другие вопросы по тегам