Не удается заставить SignalR, CORS и события, отправленные сервером, работать вместе

У меня есть сервер SignalR 2.0, размещенный в IIS7, с клиентом javascript, который в настоящее время ориентирован в основном на браузеры Chrome.

Без междоменного транспорта SignalR представляет собой события, отправленные сервером, которые работают очень хорошо и эффективно.

Я добавил поддержку CORS на сервер предложенным способом, используя Microsoft.Owin.Cors, что позволяет серверу работать с междоменным клиентом, однако транспорт SignalR теперь выполняет длительный опрос; это вызовет гораздо более высокую нагрузку на мои серверы, так как сообщения SignalR от сервера к клиенту довольно часты.

Мне бы очень хотелось, чтобы поддержка Server-Sent Events и CORS работала вместе, и, исходя из моего понимания протоколов, я не вижу причин, по которым это невозможно сделать. Какие-либо предложения? У кого-нибудь есть удача в том же сценарии с другими браузерами?


person antlersoft    schedule 10.02.2014    source источник


Ответы (1)


В настоящее время SignalR не пытается устанавливать междоменные подключения SSE по умолчанию.

Это решение было принято до того, как в браузерах появились реализации EventSource, совместимые с CORS, поэтому было сочтено расточительным даже пытаться устанавливать междоменные соединения SSE.

Начиная с SignalR 2.0.3, междоменные подключения SSE будут предприниматься по умолчанию.

Тем временем вы можете вручную указать, какие транспорты пробовать и в каком порядке их пробовать:

$.connection.hub.start({transport: ["webSockets", "serverSentEvents", "foreverFrame", "longPolling"]});

http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client#transport

person halter73    schedule 11.02.2014
comment
На самом деле мне пришлось сделать еще одну вещь (это с SignalR 2.0.1) - мне пришлось изменить код, создающий EventSource, с new windows.EventSource(url) на new windows.EventSource(url, {withCredentials: true}) -- я думаю, это требуется спецификацией SSE для CORS. - person antlersoft; 11.02.2014
comment
Хороший улов. Бит withCredentials будет в SignalR 2.0.3. - person halter73; 11.02.2014
comment
После применения $.connection.hub.start({transport: ["webSockets", "serverSentEvents", "foreverFrame", "longPolling"]}); signalR не работает должным образом внутри хрома. - person Anand Thakkar; 05.01.2015