SignalR: Ошибка при рукопожатии WebSocket: неожиданный код ответа: 400

Я только начал работать с SignalR. Я реализовал отражение данных в реальном времени на своем сайте с помощью signalr. Я получаю сообщение об ошибке "Ошибка во время установления соединения с Web-Socket: непредвиденный код ответа: 400" на консоли при попытке подключения к веб-соке.

Приложение разработано с помощью Asp.net MVC - signalR 2.0.3 и размещено на сервере Windows 2012 - IIS 8

Я нашел одно решение из этой ссылки

В нем говорится, что нам нужен веб-сайт, чтобы указать на HTTPS (и воспользоваться SSL), а затем http для работы с веб-сокетом. И моя проблема тоже решена. Я сомневаюсь - не можем ли мы решить эту проблему без использования HTTPS? Поскольку на каждом веб-сайте может не потребоваться размещение на HTTPS (для чего требуется SSL).

Ответ 1

используйте этот тег в файле web.config:

<httpRuntime maxRequestLength="40960" targetFramework="4.5" requestValidationMode="2.0" />

в теге <system.web>. Опишите целевую инфраструктуру. Исключить будет

Ответ 2

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

Как веб-сокеты HTML5 взаимодействуют с прокси-серверами

Используя безопасное соединение, вы гарантируете, что прокси-сервер не будет работать с вашим соединением.

Ответ 3

Эта ошибка 400 также может произойти, если вы работаете на нескольких серверах за балансировщиком нагрузки. Осмотрите тело ответа 400 (например, используя Fiddler) и посмотрите, находите ли вы это: The ConnectionId is in the incorrect format. Если это так, то ваша проблема может заключаться в том, что вы не используете один и тот же машинный ключ на каждом сервере приложений.

Подробнее об этом решении см. в этом ответе: fooobar.com/questions/612952/...

Ответ 4

Если вы находитесь за Nginx, добавьте эти три строки (начинающиеся с proxy_):

server {       
    listen       443; # Or 80 or whatever
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    ...
}

HTTPS/HTTP не проблема. WSS будет автоматически использоваться на страницах HTTPS, а WS - на HTTP без каких-либо ручных настроек.