Я использую 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 МБ), сообщение проходит без суеты.
Может ли тот факт, что объект происходит из другого сервиса, иметь какое-либо отношение к моей проблеме? На мой взгляд, проблема заключается в размере сообщения, но увеличение каких-либо параметров в конфигурации мне пока не помогло.
Я попытался установить на клиенте без везения. Использование потоковой передачи приводит к переключению на запросы/ответы или удалению всех обратных вызовов...
Любые идеи?