WedX - журнал о программировании и компьютерных науках

SignalR выдает 404 при использовании WebSockets или ServerSentEvents для некоторых пользователей, но не для других

SignalR дает мне 404 при попытке подключения для некоторых пользователей. URL-адреса такие же, за исключением access_token.

Он стабильно воспроизводится для каждого пользователя (я имею в виду, что некоторые пользователи стабильно работают нормально, некоторые пользователи стабильно 404).

access_token проанализировал jwt diff (слева пользователь в порядке, справа — 404): access_token проанализировал разницу jwt


Я провел трассировку журналов и получил следующее: Для пользователя OK: TRACE console.log для пользователя OK

Для пользователя, получившего ошибку 404: TRACE console.log для пользователя 404

Примечание. URL-адреса под черными квадратами одинаковы.


Front End — это Angular 9 с пакетом "@microsoft/signalr": "^3.1.8", и вот код, который создает соединение:

  private buildHub(): HubConnection {
    console.log(this.authService.accessToken);
    let builder = new HubConnectionBuilder()
                      .withAutomaticReconnect()
                      .configureLogging(LogLevel.Information)
                      .withUrl('ws/notificationHub', {
                          accessTokenFactory: () => this.authService.accessToken
                        });

    if (this.debugMode) {
      builder = builder.configureLogging(LogLevel.Trace);
    }

    return builder.build();
  }

Бэкэнд использует следующий код в Startup для настройки концентратора signalR:

In public void ConfigureServices(IServiceCollection services):

services.AddSignalR()
            .AddJsonProtocol(options =>
            {
                options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
            });

In public void Configure(IApplicationBuilder app, IHostingEnvironment env):

app.UseSignalR(route =>
            {
                route.MapHub<NotificationHub>("/ws/notificationHub");
            });

Также мы используем пользовательскую аутентификацию, поэтому у нас есть атрибут Authorize для класса Hub:

    [Authorize]
    public class NotificationHub: Hub<INotificationHubClient>

и этот код в public void ConfigureServices(IServiceCollection services):

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.Authority = identityServerSettings.Url;
                    options.Audience = identityServerSettings.ApiScopeName;
                    options.RequireHttpsMetadata = identityServerSettings.RequireHttpsMetadata;

                    options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
                    {
                        OnMessageReceived = context =>
                        {
                            var accessToken = context.Request.Query["access_token"];
                            var path = context.HttpContext.Request.Path;
                            if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/ws"))
                            {
                                context.Token = accessToken;
                            }
                            return Task.CompletedTask;
                        }
                    };
                });

К сожалению, у меня нет полного доступа к среде, где это воспроизводимо, но я могу запросить просмотр каких-либо настроек или попытаться внести некоторые изменения.

Что еще я могу попробовать, чтобы устранить проблему?


ОБНОВЛЕНИЕ: переговоры подходят для обоих пользователей.

05.10.2020

Ответы:


1

У меня была эта проблема недавно, после того, как размер моего JWT увеличился. Я обнаружил, что в моем случае IIS выдает ошибку 404, потому что строка запроса превышает ограничение в 2048. После увеличения максимальной длины строки запроса моя проблема была решена.

13.10.2020
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]