У нас есть приложение ASP.Net WebAPI 2.0, которое публикует сообщения на нашем сервере RabbitMQ. В 99% случаев все хорошо ... но случайным образом приложение прекращается с исключением System.AccessViolationException без видимых причин.RabbiMQ C# драйвер вызывает System.AccessViolationException
Как предотвратить эту ошибку? Может быть, это связано с недавним обновлением драйвера 3.6.6 C# (он отлично работал до обновления)?
Вещи, которые я уже устранен:
- Новый
IModel
используется для каждой опубликовывать (я знаюIModel
не нитку сейф) - Вызов производится в
CreateConnection
для каждого вызова, а (I знаю, что я могу повторно использовать соединение, но сейчас мы этого не делаем). СоединениеAutoClose = true;
- Канал используется в блоке, используя ... так он расположен каждый раз, когда
Вот стопка образца след, где она взрывается:
Сведения об исключении
System.AccessViolationException
Попытка чтения или защищен от записи память. Это часто свидетельствует о том, что другая память повреждена.
в System.Net.UnsafeNclNativeMethods.SafeNetHandlesXPOrLater.GetAddrInfoW (String NODENAME, String SERVICENAME, AddressInfo & намеков, SafeFreeAddrInfo & ручка) на System.Net.Dns.TryGetAddrInfo (имя String, AddressInfoHints флаги, IPHostEntry & hostinfo) в System.Net.Dns.InternalGetHostByName (String, Boolean HostName includeIPv6) в System.Net.Dns.GetHostAddresses (Строка hostNameOrAddress) в RabbitMQ.Client.TcpClientAdapter.BeginConnect (String хост, порт Int32, AsyncCallback requestCallback, Object состояние) у RabbitMQ.Client.Impl.SocketFrameHandler.Connect (ITcpClient розетка, AmqpTcpEndpoint конечная точка, Int32 тайм-аут) на RabbitMQ.Client.Impl.SocketFrameHandler..ctor (AmqpTcpEndpoint конечная точка, Func`2 SocketFactory, Int32 ConnectionTimeOut, Int32 ReadTimeout, Int32 WriteTimeout) в RabbitMQ.Client.Framing.Impl .ProtocolBase.CreateFrameHandler (AmqpTcpEndpoint конечная точка, Func'2 SocketFactory, Int32 ConnectionTimeOut, Int32 ReadTimeOut, Int32 WriteTimeout) в RabbitMQ.Client.ConnectionFactory.CreateConnection (IList'1 конечных точек, String clientProvidedName)
И еще
System.Net.UnsafeNclNativeMethods + SafeNetHandlesXPOrLater.GetAddrInfoW (System.String, System.String, System.Net.AddressInfo ByRef, System.Net.SafeFreeAddrInfo ByRef) System.Net.Dns.TryGetAddrInfo (System.String, System.Net.AddressInfoHints, System.Net.IPHostEntry ByRef) System.Net.Dns.InternalGetHostByName (System.String, Boolean) System.Net.Dns.GetHostAddresses (System.String) RabbitMQ.Client.TcpClientAdapter.BeginConnect (System.String, Int32, System.AsyncCallback, System.Object) RabbitMQ.Client.Impl.SocketFrameHandler.Connect (RabbitMQ.Client.ITcpClient, RabbitMQ.Client.AmqpTcpEndpoint, Int32) RabbitMQ.Client.Impl.SocketFrameHandler..ctor (RabbitMQ.Client.AmqpTcpEndpoint, System.Func'2, Int32, Int32, Int32) RabbitMQ .Client.Framing.Impl.ProtocolBase.CreateFrameHandler (RabbitMQ.Client.AmqpTcpEndpoint, System.Func'2, Int32, Int32, Int32) RabbitMQ.Client.ConnectionFactory.CreateConnection (System.Collections.Generic.IList'1, System.String)
Благодарим вас за ввод.
Наша реализация не создает новый класс «Отправитель» каждый раз, но у нас есть канал, завернутый в использование.
Для справки, моя реализация работает уже 3 года без проблем ... и недавно началась неудача. Возможно, это ошибка в версии драйвера, которую я только что обновил до (3.6.6)
–
Какую версию RabbitMQ вы используете. Мы обнаружили несколько проблем с 3.6.4. Главным из них были сердечные удары, которые вызывали ошибки у клиента и нарушали связь. (исправлено в 3.3.6. Я считаю, что в соответствии с замечаниями об исправлениях). В зависимости от вашей обработки ошибок это может быть так. Только заметил это через журналы событий Windows, в которых указанная ошибка возникла из клиента .NET rabbitmq с «heartbeats» в качестве проблемы. – Kelly
Наш водитель 3.6.6 .... не уверен о сервере, но я могу проверить. –