Не могу отправлять большие сообщения через 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 в поведении службы на стороне хоста.