SignalR 2.2 и ARR3.0 Балансировка нагрузки
Я использую веб-приложение signalr2.2 и размещен в IIS-8. Здесь я попытался реализовать балансировку нагрузки для моего приложения, используя ARR3.0. В моей ферме серверов я подключил два сервера и установил правило маршрутизации как "взвешенный круговой прием". У каждого сервера есть клиент JavaScript с HTML-страницей. Пока я обращаюсь к HTML-странице любого сервера, запрос был перенаправлен, как и ожидалось, но у меня есть эта ошибка на моей HTML-странице, и сигнализатор не подключается
WebSocket подключение к 'WS://mydomain.com/signalr/connect транспорт = WebSockets& ClientProtocol=1,5&connectionToken=x9rAfatyMm3TbqzrYKL1K37Z4tKrUTH7bwNmSItW55Z0ms6pe43YiQGFOmaHMyT%2BpmGz62ukt4tha72vPcJhdqLtIvsQvqvY15oYGv69JjzSuuiSL7v2l%2FccZT6tQa3Z&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D& TID =1' Сбой: Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 400
Если я отключу кого-либо из этого сервера в моем serverfarm, то сигнализатор будет работать нормально, и никаких ошибок не будет. Помогите мне найти решение.
Если я свяжусь с сервером сигнализации из моего клиентского приложения.net, он выдаст следующую ошибку
Ошибка при запуске запроса. Остановка соединения.
2 ответа
У меня тоже была эта проблема. Если заглянуть глубже, ошибка такова: The connection id is in the incorrect format
, Немного погуглив, я где-то читал, что при работе в среде фермы серверы должны использовать один и тот же ключ компьютера, который можно настроить в IIS.
Для этого выполните следующие действия:
- Откройте IIS, подключающийся к любому из ваших серверов в ферме.
- На узле сервера откройте параметр " Ключ компьютера" на правой панели.
- В правом меню выберите " Создать ключи".
- Снимите флажок
Generate a unique key for each application
опция для ключа проверки и ключа расшифровки. - Скопируйте два сгенерированных ключа (например, вставьте в блокнот)
- Убедитесь, что все серверы в ферме используют одни и те же ключи (серверу ARR это не нужно), возможно, вам придется повторить описанные выше действия с ними (может быть, вам не нужно, как только они используют общую конфигурацию).
Кроме того, вы должны убедиться, что ваше приложение на каждом сервере использует одну и ту же идентификационную информацию. Например, выберите узел приложения (или узел сайта, если это так), в правом меню выберите " Основные настройки", затем " Подключить как...". Если выбран вариант " Пользователь приложения", вам необходимо проверить, как настроен ваш пул приложений. Если он использует сетевую службу (как и моя), у вас все равно будут проблемы, потому что каждый сервер использует свои собственные учетные данные, но вы должны убедиться, что они используют одну и ту же идентификационную информацию.
В моем сценарии мне нужно было создать пользователя с доступом к каждому серверу в ферме и заставить приложение использовать этого же пользователя. Только после этого моя проблема была решена.
В дополнение к ответу @Alisson я нашел простой способ установки ключа машины.
Вы можете напрямую сделать этот параметр в вашем файле Web.config. Просто создайте запись для machine Key в разделе system.web. Запись будет выглядеть
<system.web>
<machineKey validationKey="###############YOUR#####VALIDATION ######KEY####################################################################################" decryptionKey="#####YOUR####DECRYPTION#####KEY#################" validation="SHA1" decryption="Auto" />
</system.web>
Уникальный ключ проверки и ключ расшифровки могут быть сгенерированы с помощью шагов, указанных в ответе @Alisson.
Используя этот подход, вам не нужно беспокоиться об изменении вашего сервера в любой момент или развертывании на любом другом сервере веб-фермы. Ваш код будет работать без проблем.