我有一个分布式应用程序,它在内部千兆网络上使用.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个请求,具有更高流量的突发。在任何情况下,服务器似乎都可以正常处理流量,如果服务器过载,我会发现一个完全不同的错误。
任何想法导致此错误的原因是什么?
答案 0 :(得分:2)
当收到错误标题的邮件时,通常会发生此错误。您可以通过创建与服务器的telnet连接并键入内容来重复此错误。在大多数情况下,这是一个网络错误。
我强烈建议您检查防火墙。由于错误的攻击警报,一些防火墙会丢弃网络数据包。
负载平衡是另一个可能的原因。负载均衡器将数据包拆分到不同的服务器。
答案 1 :(得分:0)
当MS DNS服务器使用过多开放端口时,我发现此问题,因此无法创建出站端口。是的,非常有趣。