#rabbitmq #rabbitmq-.net
Вопрос:
У нас есть простой клиент RabbitMQ .NET в ASP.NET Веб-приложение, работающее под управлением IIS 8. Мы не используем SSL, и код подключения прост.
var factory = new ConnectionFactory()
{
HostName = hostname,
UserName = username,
Password = password,
VirtualHost = vhost,
Port = 5672
};
var connection = factory.CreateConnection();
В последней строке создается следующее исключение
Exception Occurred
Type: RabbitMQ.Client.Exceptions.BrokerUnreachableException
Message: None of the specified endpoints were reachable
Stack Trace: at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName) in /_/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs:line 505
at Org.Prod.Dependency.Concrete.Queuing.RabbitMqProdMessenger.SendMessage[TMessage](String hostname, String username, String password, String vhost, String target, TMessage message, Boolean targetIsExchange)
Source: RabbitMQ.Client
Inner Exception
Type: System.IO.IOException
Message: connection.start was never received, likely due to a network timeout
Stack Trace: at RabbitMQ.Client.Framing.Impl.Connection.StartAndTune() in /_/projects/RabbitMQ.Client/client/impl/Connection.cs:line 1074
at RabbitMQ.Client.Framing.Impl.Connection.Open(Boolean insist) in /_/projects/RabbitMQ.Client/client/impl/Connection.cs:line 707
at RabbitMQ.Client.Framing.Impl.AutorecoveringConnection.Init(IFrameHandler fh) in /_/projects/RabbitMQ.Client/client/impl/AutorecoveringConnection.cs:line 646
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName) in /_/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs:line 495
Source: RabbitMQ.Client
Интересно, что когда один и тот же код помещается в консольное приложение, а двоичные файлы отправляются на один и тот же сервер, на котором запущено приложение, консольное приложение подключается нормально и может публиковать сообщения.
Что плохого в том, что веб-приложение пытается сделать то же самое, что делает консольное приложение?
Ответ №1:
Это был сбой привязки сборки System.Threading.Tasks.Extensions
, наш регистратор исключений не регистрировал InnerException
Exception information:
Exception type: FileLoadException
Exception message: Could not load file or assembly 'System.Threading.Channels, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
at RabbitMQ.Client.Framing.Impl.AutorecoveringConnection..ctor(ConnectionFactory factory, String clientProvidedName)
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName) in /_/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs:line 494
Очень плохое вводящее в заблуждение сообщение об ошибке.
Комментарии:
1. Итак, как вы это исправили?
2. @MAkin Я заглянул в свои двоичные файлы , чтобы узнать, какие версии
System.Threading.Tasks.Extensions
и их зависимости существуют. Затем я добавил перенаправление привязки, чтобы указать на эти версии сборок.3. В моем случае я получил точно такое же исключение при вызове factory. createConnection(); я использую RabbitMQ.Client 6.2.1 в библиотеке, которая зависела от System.Buffers 4.5.1, и моя основная сборка ссылалась на System.Buffers 4.4.0, обновила мою основную сборку до справочной версии 4.5.1 System.Buffers, и проблема исчезла.
4. @Angristпишите это в качестве ответа, чтобы другие могли извлечь из этого пользу
Ответ №2:
В моем случае я получил точно такое же исключение при вызове фабрики.createConnection(); Я использую RabbitMQ.Client 6.2.1 в библиотеке, которая зависела от System.Buffers 4.5.1 и моей основной сборки, на которую ссылается System.Buffers 4.4.0, обновил мою основную сборку до справочной версии 4.5.1 System.Buffers, в которой участвовало множество других зависимых Microsoft. и Система. сборки удаляются сначала, прежде чем я смогу удалить, а затем повторно добавить System.Buffers через диспетчер пакетов NuGet, поскольку это сказало мне, что у меня было 4.5.1, когда мой файл .csproj сказал, что он ссылается на 4.4.0. Как только эта проблема с ссылками была решена, проблема исчезла, и я смог подключиться к серверу RabbitMQ.