Что касается конфигурации:
У нас есть три сервера Windows, которыми мы управляем сами. На этих серверах мы размещаем различные API C# с .Net 8 и IIS. Все три сервера настроены одинаково. Здесь также размещается кластер RabbitMQ.
Cloudflare используется в качестве балансировщика нагрузки, но без привязки сеансов, поскольку для него требуется прокси-сервер, а мы не хотим его использовать. Пока все хорошо.
Теперь к проблеме:
API, который использует кластер RabbitMQ, подключается к локальному экземпляру RabbitMQ через localhost с использованием Rebus. Насколько я понимаю, сообщения в кластере автоматически раздаются по всем узлам.
Код: Выделить всё
[...]
services
.AddSignalR( _ => {
_.EnableDetailedErrors = true;
} )
.AddMessagePackProtocol( _ => {
_.SerializerOptions = MessagePackSerializerOptions.Standard
.WithSecurity( MessagePackSecurity.UntrustedData );
} )
.AddRebusBackplane(); // changed for post
[...]
string rabbitMqConnectionString =
$"amqp://rabbit:carrot@localhost:5672/myvhost"; // changed for post
services.AddRebus( configure => configure
.Transport( x => {
x.UseRabbitMq( rabbitMqConnectionString, GenerateTransientQueueName( "queuename" ) )
.InputQueueOptions( o => {
o.SetAutoDelete( true );
o.SetDurable( false );
} );
} ) );
services.AddSingleton();
[...]
app.UseEndpoints( endpoints => {
endpoints.MapControllers();
endpoints.MapHub( "/myhub" ); // changed for post
} );
[...]
Код: Выделить всё
[...]
_httpContextAccessor = httpContextAccessor;
_context = context;
_securityService = securityService;
Claim[]? claims = _httpContextAccessor.HttpContext?.User.Claims.ToArray();
if (_httpContextAccessor == null) throw new Exception( "Httpcontextaccessor is null" );
if (_httpContextAccessor.HttpContext == null) throw new Exception( "Httpcontextaccessor => Httpcontext is null" ); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79369930/httpcontext-is-lost-when-using-a-c-sharp-rabbitmq-cluster[/url]
Мобильная версия