завод.Функция createConnection() создает сообщение о том, что ни одна из указанных конечных точек не была доступна;

#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.