我有一个分布式应用程序,它在内部千兆网络上使用.NET Remoting.有一台服务器,以及十几个连接到服务器的客户端.客户端运行多个线程,每个客户端最多可以有10个并发请求.
这个应用程序大多数时候都很好用.服务器一次保持数月.我不时会在客户端上遇到异常,我无法弄清楚导致异常的原因.异常和堆栈跟踪是:
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)
这是堆栈跟踪回到我进行远程调用的地方.
我看起来并且在我正在进行的调用中或在服务器返回的数据中找不到任何异常.
谷歌搜索此错误并不是很有成效.我见过的大多数错误都是围绕某人从HTTP转换为TCP而不是改变所有内容,所以当他们尝试连接时会遇到异常.在我的情况下,客户端将在我收到此错误之前运行几天.
另一个数据点:服务器确实收到了很多请求.大多数客户端都是Web爬虫,每个客户端每分钟向服务器发出2,000多个请求.因此,服务器每秒处理超过500个请求,具有更高流量的突发.在任何情况下,服务器似乎处理流量没问题,如果服务器过载,我会发现一个非常不同的错误.
是什么原因造成了这个错误?