Non è possibile inviare messaggi di grandi dimensioni su WCF
-
09-10-2019 - |
Domanda
Im usando WCF per l'invio di tutti i tipi di messaggi e questo messaggio nella perticular è di circa 3200000 byte più alcune stringhe e le intestazioni. La grande paylode è un oggetto serializzato recuperato dall'host attraverso un altro servizio di configurazione whos ho cercato di imitare in ogni aspetto.
Im usando vincolante netTcp per le prestazioni e che stiamo usando un sacco di callback. Ho impostato tutte le opzioni che posso trovare al livello massimo su entrambi i lati client e server.
<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>
ottengo questo messaggio di errore non descritto sul client:
La connessione socket è stata interrotta. Questo potrebbe essere causato da un errore l'elaborazione messaggio o una ricezione timeout superamento dal telecomando host o una rete sottostante questione delle risorse. Local timeout presa era '00: 00:. 59,9,979996' millions
E exteption interno:
Una connessione esistente veniva chiusa forzatamente dall'host remoto
traccia esecuzione porta un po 'più di informazioni (parte superiore della traccia dello stack):
System.ServiceModel.Channels.SocketConnection.Write (Byte [] tampone, Int32 compensato, dimensioni Int32, Booleano immediato, TimeSpan timeout) Cima alla pila traccia exteption interno: System.Net.Sockets.Socket.Send (Byte [] tampone, Int32 compensato, dimensioni Int32, SocketFlags socketFlags)
Top dello stack trace eccezione interna:
System.Net.Sockets.Socket.Send (Byte [] tampone, Int32 compensato, dimensioni Int32, SocketFlags socketFlags)
Se ho impostato il carico utile a nulla (non inviare l'oggetto 3.2 MB) il messaggio passa attraverso senza tante storie.
Può il fatto che ha origine oggetto da un altro servizio ha qualcosa a che con il mio problema? Ai miei occhi il problema è la dimensione del messaggio, ma aumentando le opzioni nella configurazione non mi ha aiutato finora.
Ho cercato di serie sul client senza fortuna. Utilizzando i risultati in streaming nel passaggio di richiesta / respons o la rimozione di tutte le richiamate ...
Tutte le idee?
Soluzione
mi sbagliavo !! I cambiamenti che ho fatto sui livelli di configurazione sul lato host era su un servizio completamente diverso. Massimizzare il buffer di formati e dimensioni dei messaggi ha fatto il trucco! Im non realmente sicuro che uno è quello che ha reso il lavoro. Posso solo raccomandare a tutti voi che hanno problemi simili a guardare MaxBufferSize, MaxReceivedMessageSize, ReaderQuotas-> MaxArrayLength e un po 'di tempo fuori le impostazioni sia sul host e lato client. Anche per massimizzare l'maxItemsInObjectGraph nel comportamento di servizio sul lato host.