2010-08-30 27 views
8

Tengo una aplicación distribuida que usa .NET Remoting en una red gigabit interna. Hay un único servidor y más de una docena de clientes que se conectan al servidor. Los clientes ejecutan varios subprocesos, y puede haber hasta 10 solicitudes simultáneas de cada cliente.¿Qué causa la "violación del protocolo de canal Tcp esperando el preámbulo" en .NET Remoting?

Esta aplicación funciona muy bien la mayor parte del tiempo. El servidor se mantiene activo durante meses a la vez. De vez en cuando recibo una excepción en un cliente, y no puedo entender qué causa la excepción. La excepción y el seguimiento de la pila son:

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) 

Ese es el seguimiento de la pila hacia donde realizo la llamada remota.

He buscado y no puedo encontrar nada fuera de lo común en las llamadas que estoy realizando ni en los datos que me devuelve el servidor.

Las búsquedas en Google de este error no son muy fructíferas. La mayoría de los errores que he visto giran en torno a alguien que convierte de HTTP a TCP y no cambia todo, por lo que reciben la excepción cuando intentan conectarse. En mi caso, el cliente se ejecutará durante días antes de que aparezca este error.

Otro punto de datos: el servidor recibe muchas solicitudes. La mayoría de los clientes son rastreadores web que cada uno realiza más de 2.000 solicitudes al servidor cada minuto. Por lo tanto, el servidor está procesando más de 500 solicitudes por segundo, con ráfagas de mayor tráfico. En cualquier caso, el servidor parece manejar bien el tráfico, y esperaría un error muy diferente si el servidor se sobrecarga.

¿Alguna idea de qué está causando este error?

+0

¿Pérdidas aceptables? ; P – leppie

Respuesta

2

Este error suele ocurrir cuando se recibe un mensaje con encabezados incorrectos. Puede repetir este error al crear una conexión telnet con su servidor y escribir algo. En la mayoría de los casos, es un error de red.

Recomiendo mucho que verifique su firewall. Algunos cortafuegos dejan caer los paquetes de red debido a una alerta de ataque incorrecta.

El equilibrio de carga es otro motivo posible. El equilibrador de carga divide los paquetes en diferentes servidores.

+0

Podría ser el cortafuegos. Empujo mucho tráfico a través de él y, aunque puede manejar fácilmente el volumen promedio de tráfico, quizás haya explosiones que invaden sus búferes o algo así. Estoy trabajando en algunas modificaciones a mi código que suavizarán el tráfico para eliminar lo peor de esas ráfagas. –

+0

Si existe alguna propiedad en un objeto marshallbyref, puede intentar convertirlas en métodos. Cada vez que accede a la propiedad provoca una llamada de mensaje. Convertirlos a métodos reduce los mensajes entre el cliente y el servidor. También puede serializar algunas clases para el almacenamiento en caché del cliente. – ertan

+0

No hay propiedades accesibles en el objeto remoto. Parece que es el interruptor. Estoy presionando una increíble cantidad de paquetes a través de este interruptor, y parece que el interruptor simplemente no puede manejarlo. En cualquier caso, estoy convencido de que el error no es una falla del software, sino un problema de hardware. Gracias por la respuesta. –

0

Veo este problema cuando el servidor DNS de MS usa demasiado el puerto abierto, por lo que no se puede crear el puerto de salida. Sí, es muy gracioso.

Cuestiones relacionadas