У меня есть распределенное приложение, которое использует .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)
Это трассировка стека туда, где я делаю удаленный вызов.
Я искал и не могу найти ничего необычного в совершаемых мной вызовах или в данных. что сервер возвращается.
Google ищет эту ошибку не очень плодотворно. Большинство ошибок, которые я видел, связаны с тем, что кто-то конвертирует HTTP и TCP и не меняет все, поэтому они получают исключение при попытке соединения. В моем случае клиент будет работать в течение дней , прежде чем я получу эту ошибку.
Еще один момент данных: сервер действительно получает много запросов. Большинство клиентов - это веб-сканеры, каждый из которых делает более 2, 000 запросов к серверу каждую минуту. Таким образом, сервер обрабатывает свыше 500 запросов в секунду, с пакетами более высокого трафика. В любом случае сервер, похоже, нормально обрабатывает трафик, и я ожидаю, что в случае перегрузки сервера произойдет совсем другая ошибка.
Есть идеи, что является причиной этой ошибки?
Эта ошибка обычно возникает, когда сообщение получено с неверными заголовками. Вы можете повторить эту ошибку, создав telnet-соединение с вашим сервером и набрав что-нибудь. В большинстве случаев это ошибка сети.
Я настоятельно рекомендую проверить ваш брандмауэр. Некоторые брандмауэры отбрасывают сетевые пакеты из-за неправильного оповещения об атаке.
Балансировка нагрузки — еще одна возможная причина. Балансировщик нагрузки разбивает пакеты на разные серверы.