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

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

Я использую привязку 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 (буфер Byte[], смещение Int32, размер Int32, SocketFlags socketFlags)

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

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

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

Любые идеи?


person Martin Larsson    schedule 07.12.2010    source источник
comment
1) Опубликуйте свой maxReceivedMessageSize и readerQuota 2) Как продвигается полезная нагрузка? Байтовый массив?   -  person Aliostad    schedule 07.12.2010
comment
1) Куда идет maxReceivedMessageSize? читательские квоты уже размещены!? 2) Полезная нагрузка представляет собой байт[]   -  person Martin Larsson    schedule 07.12.2010
comment
Попробуйте увеличить время ожидания отправки.   -  person DarrellNorton    schedule 07.12.2010
comment
ваша служба размещена на IIS? IIS версии 7.5?   -  person zam6ak    schedule 07.12.2010
comment
Я запускаю клиент в VS 2010, и служба представляет собой автономную службу Windows.   -  person Martin Larsson    schedule 08.12.2010


Ответы (1)


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

person Martin Larsson    schedule 08.12.2010