Не могу отправлять большие сообщения через WCF - PullRequest
1 голос
/ 07 декабря 2010

Я использую 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, логическое немедленное, тайм-аут тайм-аута) Внутреннее расширение трассы стека: System.Net.Sockets.Socket.Send (буфер Byte [], смещение Int32, размер Int32, SocketFlags socketFlags)

Вверхвнутреннего исключения трассировки стека:

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

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

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

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

Есть идеи?

1 Ответ

0 голосов
/ 08 декабря 2010

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

...