Я работаю над asp.net core 2.2
веб-приложением MVC. Мы используем signal r core version 1.1.0
(добавлено через пакет nuget Microsoft.AspNetCore.SignalR
). Клиентское приложение - это приложение angularjs, ссылающееся на версию 1.1.4
библиотеки javascript aspnet-signalr
.
Наше приложение развернуто в Azure, а служба приложений хостинга масштабируется по горизонтали: в настоящее время two instances
нашего веб-приложения запущено и работает. Я тестирую поведение моего приложения, используя Google chrome version 75.0.3770.100
на компьютере с Windows 10.
Служба приложения настроена таким образом, что веб-сокеты включены и сходство ARR отключено . Я испытываю странное поведение, в основном, если я тестирую свое приложение и выполняю несколько аппаратных обновлений браузера (ctrl + F5), случается случайным образом, что клиентское приложение не может подключиться к концентратору уведомлений. В консоли Google Chrome сообщается о следующих ошибках:
WebSocket connection to 'wss://myapp.azurewebsites.net/notificationsHub?id=3Fmlw2yC5qm3vi0qny50Qg' failed: Error during WebSocket handshake: Unexpected response code: 404
Error: Failed to start the transport 'WebSockets': null
GET https://myapp.azurewebsites.net/notificationsHub?id=nEYPEDw5f0AkLz5otCAOyA 404
Error: Failed to start the transport 'ServerSentEvents': Error: Error occurred
GET https://myapp.azurewebsites.net/notificationsHub?id=2G9VVr5mcx7QT2wbSfwDLA&_=1561652513485 404
Error: Failed to start the transport 'LongPolling': Error
Error: Failed to start the connection: Error: Unable to initialize any of the available transports.
Если я изменю конфигурацию службы приложения так, чтобы включались и веб-сокеты, и сходство ARR , все работало как чудо. Я подозреваю, что , когда служба приложения масштабируется по горизонтали, тогда сродство ARR требуется независимо от транспортного протокола (в моем случае, и приложение на стороне сервера, и браузер клиента могут поддерживать протокол веб-сокета) .
Насколько я понимаю, в официальной документации Microsoft указано, что при использовании веб-сокетов в качестве протокола связи привязка ARR клиента не требуется, даже если служба приложения хостинга горизонтально масштабируется до нескольких экземпляров . На данный момент я не уверен в своем понимании документации ядра сигнализатора.
Я что-то упустил? Я неправильно понял официальную документацию?
РЕДАКТИРОВАТЬ 3 ИЮЛЯ 2019
Для тех, кто интересуется этой темой (масштабирование веб-приложения с использованием ядра signal-r), вы можете обратиться к этому выпуску github для всех деталей.
Короткий ответ - это то, что новое ядро signal-r фактически сохраняет состояние и требует липких сеансов, когда приложение масштабируется до нескольких серверов.
Если вы работаете только в Azure, вы можете избежать использования липких сессий и получить ряд других преимуществ, воспользовавшись службой сигнализации Azure .
Если вы не хотите использовать эту службу Azure, единственная опция, позволяющая избежать зависания сеансов, - это настройка ядра r таким образом, чтобы избежать согласования протокола клиент-сервер и обмен данными осуществляется только с помощью веб-сокетов (подробности см. В связанном выпуске github). Обратите внимание, что при этом вы потеряете возможность перехода на другие протоколы, когда веб-сокеты не поддерживаются, что является одной из основных функций ядра signal-r.