2010-08-30 22 views
8

Ho un'applicazione distribuita che utilizza .NET Remoting su una rete gigabit interna. C'è un singolo server e oltre una dozzina di client che si connettono al server. I client eseguono più thread e possono essere presenti fino a 10 richieste simultanee da ciascun client.Che cosa causa "violazione del protocollo del canale Tcp in attesa di preambolo" in .NET Remoting?

Questa applicazione funziona molto bene il più delle volte. Il server rimane attivo per mesi alla volta. Di tanto in tanto ottengo un'eccezione su un client e non riesco a capire cosa stia causando l'eccezione. L'eccezione e la traccia di stack sono:

System.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble. 

Server stack trace: 
    at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble() 
    at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders() 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream) 
    at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 

Questa è la traccia di stack a cui effettuare la chiamata remota.

Ho cercato e non riesco a trovare nulla di straordinario nelle chiamate che sto facendo, o nei dati che il server sta restituendo.

Le ricerche di Google per questo errore non sono molto fruttuose. La maggior parte degli errori che ho visto ruotano intorno a qualcuno che converte da HTTP a TCP e non cambia tutto, quindi ottengono l'eccezione quando provano a connettersi. Nel mio caso, il client verrà eseguito per giorni prima di ricevere questo errore.

Un altro punto dati: il server riceve molte richieste. La maggior parte dei client sono crawler Web che eseguono ogni minuto più di 2.000 richieste al server. Quindi il server sta elaborando verso l'alto di 500 richieste al secondo, con raffiche di traffico più elevato. In ogni caso, il server sembra gestire il traffico a posto e mi aspetterei un errore molto diverso se il server si sovraccaricasse.

Qualche idea su cosa sta causando questo errore?

+0

Perdite accettabili? ; P – leppie

risposta

2

Questo errore si verifica in genere quando viene ricevuto un messaggio con intestazioni errate. Puoi ripetere questo errore creando una connessione telnet al tuo server e scrivi qualcosa. Nella maggior parte dei casi si tratta di un errore di rete.

Consiglio vivamente di controllare il firewall. Alcuni firewall eliminano i pacchetti di rete a causa di un avviso di attacco errato.

Il bilanciamento del carico è un'altra possibile ragione. Il bilanciamento del carico suddivide i pacchetti su server diversi.

+0

Potrebbe benissimo essere il firewall. Spingo molto traffico attraverso di esso e sebbene possa gestire facilmente il volume di traffico medio, forse ci sono raffiche che invadono i suoi buffer o qualcosa del genere. Sto lavorando ad alcune modifiche al mio codice che appianeranno il traffico al fine di eliminare il peggiore di quelle esplosioni. –

+0

Se esiste una proprietà su un oggetto marshallbyref, è possibile provare a convertirli in metodi. Ogni volta che si accede alla proprietà, viene generata una chiamata. La loro conversione in metodi riduce i messaggi tra client e server. Inoltre è possibile serializzare alcune classi per la memorizzazione nella cache del client. – ertan

+0

Non ci sono proprietà accessibili sull'oggetto remoto. Sembra che sia l'interruttore. Sto spingendo un numero incredibile di pacchetti attraverso questo switch, e sembra che l'interruttore non sia in grado di gestirlo. In ogni caso, sono convinto che l'errore non sia un errore del software, ma piuttosto un problema hardware. Grazie per la risposta. –

0

Ho riscontrato questo problema quando il server MS DNS ha utilizzato troppe porte aperte, pertanto non è possibile creare la porta in uscita. Sì, è molto divertente.

Problemi correlati