В настоящее время я рву волосы на работе, пытаясь решить проблему с веб-приложением, которое использует SignalR через WebSockets, где трафик направляется через брандмауэр веб-приложений Barracuda (WAF). Каждая попытка подключиться к signalr/connect
конечная точка, использующая веб-сокеты, завершится ошибкой с ошибкой 400 Bad Request. Затем соединение возвращается к опросу WebServer, который работает, но это не то, что мы хотим.
Запросы отправляются на наш брандмауэр веб-приложений Barracuda, а затем отправляются на наши веб-серверы IIS с балансировкой нагрузки. Мы используем IIS 8.5 на Windows Server 2012R2, и это приложение представляет собой веб-приложение .Net 4.6.2.
Та же самая установка (без использования Barracuda WAF) работает без проблем.
Включены веб-сокеты в WAF согласно этой статье https://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket. Я все еще получаю ту же ошибку 400.
Проверено, чтобы убедиться, что на моих серверах IIS есть WebSocket
Функция включена.
Включена отладка / трассировка SignalR в Web.Config согласно https://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing. Это приводит к файлам журнала, но нет указывает на ошибки.
Я не уверен, что еще проверить?
Итак, я обнаружил свою проблему. Я обнаружил, что на самом деле мы сначала отправляем наш трафик в наш WAF через Azure Load Balancer. Когда я выхожу из заголовков в журналах доступа WAF, я вижу, что Connection
заголовок не имеет значения, и я знаю, что мой клиент отправляет его как Upgrade
.
Казалось бы, проблема с использованием балансировщика нагрузки Azure. Поэтому я решил использовать вместо этого шлюз приложений Azure.
Однако на данный момент я могу заставить это работать, если WAF добавит Connection
Заголовок для меня, настроив правило перезаписи заголовка для отправки этого заголовка на мои серверы IIS.
Обязательные заголовки для веб-сокетов
Connection: Upgrade
Upgrade: websockets
В разделе «Перезапись HTTP-запроса» добавьте новое правило перезаписи…
Header Upgrade eq websocket
как условие перезаписи. Теперь это будет применять правило только тогда, когда Upgrade
заголовок содержит значение websocket
.Теперь, когда я снова пытаюсь загрузить приложение и бум, соединение с / signalr / connect с транспортом webSockets выполнено успешно!
Более подробная информация доступна на моем Сообщение блога