Httpcontext теряется при использовании кластера C#/rabbitmqC#

Место общения программистов C#
Ответить
Anonymous
 Httpcontext теряется при использовании кластера C#/rabbitmq

Сообщение Anonymous »

Я долго искал решение этой проблемы и теперь спрашиваю здесь. Возможно, у кого-то здесь есть подобная проблема, и он сможет дать мне совет.
Что касается конфигурации:
У нас есть три сервера 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
} );

[...]
Доступ к API осуществляется через приложение NextJS через хаб с Signalr. Если доступ теперь осуществляется через балансировщик нагрузки, то после нескольких обновлений страницы Httpcontext в Httpcontextaccessor внезапно становится нулевым. Это также происходит, если целевой хост не изменен.

Код: Выделить всё

[...]

_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" ); //  mytoken,
skipNegotiation: true, // 

Подробнее здесь: [url]https://stackoverflow.com/questions/79369930/httpcontext-is-lost-when-using-a-c-sharp-rabbitmq-cluster[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»