Вопрос
Может ли кто -нибудь сообщить мне, как работает Signalr на высоком уровне?
Я предполагаю, что это промывает данные, используя Response.Flush
и на стороне клиента он отправляет запросы AJAX через определенные интервалы. Это правильно?
Решение
Нет, Signalr - это абстракция над соединением. Это дает вам две модели программирования над этим соединением (HUBS и постоянные соединения). SignalR имеет концепцию транспорта, каждый транспорт решает, как данные отправляются/получены и как он соединяется и отключается.
Signalr имеет несколько встроенных транспортов:
- Вебсокеты
- Сервер отправил события
- Навсегда кадр
- Длинный опрос
SignalR пытается выбрать «лучшее» соединение, поддерживаемое сервером и клиентом (вы также можете заставить его использовать конкретный транспорт).
Это высокий уровень. Если вы хотите увидеть, как реализован каждый транспорт, вы можете посмотреть на исходный код.
Есть также клиент -код для каждого транспорта:https://github.com/signalr/signalr/tree/master/src/microsoft.aspnet.signalr.client.js
Если вы спрашиваете о том, как работает длинный перевозчик, в частности:
Он отправляет запрос AJAX на сервер, который асинхронно ждет сигнала. Когда есть сигнал или время запроса, он возвращается с сервера и отправляет другой запрос, и процесс продолжается. (Я оставил некоторые подробности о том, как клиент он отслеживает то, что он видел, чтобы он не пропускал сообщения)
Надеюсь, это отвечает на большую часть вашего вопроса.
Другие советы
@davidfowl уже ответил на основную часть. Однако предоставить более подробную информацию о разнице в поведении транспорта, особенно между WebSocket и другими транспортами; Ниже приведены некоторые моменты.
- WebSocket-единственный транспорт, который устанавливает истинное постоянное двустороннее соединение между клиентом и сервером. Тем не менее, WebSocket поддерживается только IIS 8 или выше, а также последними версиями Internet Explorer, Google Chrome и Mozilla Firefox.
- В то время как сервер отправлял события, навсегда кадр и длительный опрос, все трое следуют односторонним общению и поддерживаются большинством браузеров.