O que causa a “violação do protocolo de canal TCP, esperando preâmbulo” no .NET Remoting?

StackOverflow https://stackoverflow.com/questions/3603431

  •  25-09-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo distribuído que usa o .NET remoto em uma rede de gigabits interna. Há um único servidor e mais de uma dúzia de clientes que se conectam ao servidor. Os clientes executam vários threads e pode haver até 10 solicitações simultâneas de cada cliente.

Este aplicativo funciona muito bem na maioria das vezes. O servidor permanece por meses por vez. De tempos em tempos, recebo uma exceção em um cliente e não consigo descobrir o que está causando a exceção. A exceção e o rastreamento da pilha são:

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)

Essa é a pilha rastrear para onde eu faço a chamada remota.

Eu olhei e não consigo encontrar nada fora do comum nas chamadas que estou fazendo ou nos dados que o servidor está retornando.

As pesquisas do Google por esse erro não são muito proveitosas. A maioria dos erros que eu vi girando em torno de alguém convertendo do HTTP para TCP e não mudando tudo, para que eles tenham a exceção quando tentam se conectar. No meu caso, o cliente será executado para dias Antes de receber esse erro.

Um outro ponto de dados: o servidor recebe muitas solicitações. A maioria dos clientes são rastreadores da Web que fazem mais de 2.000 solicitações ao servidor a cada minuto. Portanto, o servidor está processando mais de 500 solicitações por segundo, com rajadas de tráfego mais alto. De qualquer forma, o servidor parece lidar com o tráfego bem, e eu esperaria um erro muito diferente se o servidor fosse sobrecarregado.

Alguma idéia do que está causando esse erro?

Foi útil?

Solução

Esse erro geralmente acontece quando uma mensagem recebeu com cabeçalhos errados. Você pode repetir esse erro ao criar uma conexão Telnet com o seu servidor e digitar algo. Na maioria dos casos, é um erro de rede.

Eu recomendo a verificação do seu firewall. Alguns firewalls soltam os pacotes de rede devido ao alerta de ataque errado.

O balanceamento de carga é outro motivo possível. Carregar o balanceador divide os pacotes em diferentes servidores.

Outras dicas

Eu vi esse problema quando o MS DNS Server usou muita porta aberta, para que a porta de saída não possa ser criada. Sim, é muito engraçado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top