Введение в SignalRIntroduction to SignalR

по Патрик Флетчераby Patrick Fletcher

Warning

Эта документация не относится к последней версии SignalR.This documentation isn't for the latest version of SignalR. Ознакомьтесь с ASP.NET Core SignalR.Take a look at ASP.NET Core SignalR.

В этой статье описывается, что такое SignalR и какие решения он создавал.This article describes what SignalR is, and some of the solutions it was designed to create.

Вопросы и комментарииQuestions and comments

Оставьте отзыв о том, как вы понравится вам в этом учебнике, и что можно улучшить в комментариях в нижней части страницы.Please leave feedback on how you liked this tutorial and what we could improve in the comments at the bottom of the page. Если у вас есть вопросы, не связанные непосредственно с этим руководством, их можно опубликовать на форуме ASP.NET SignalR или StackOverflow.com.If you have questions that are not directly related to the tutorial, you can post them to the ASP.NET SignalR forum or StackOverflow.com.

Что такое SignalR?What is SignalR?

ASP.NET SignalR — это библиотека для разработчиков ASP.NET, которая упрощает процесс добавления веб-функций в режиме реального времени к приложениям.ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of adding real-time web functionality to applications. Веб-функции, работающие в режиме реального времени, — это возможность мгновенно отправить содержимое на подключенных клиентах по мере доступности сервера, а не ждать, пока клиент запросит новые данные.Real-time web functionality is the ability to have server code push content to connected clients instantly as it becomes available, rather than having the server wait for a client to request new data.

SignalR можно использовать для добавления любых видов веб-функций в режиме реального времени в приложение ASP.NET.SignalR can be used to add any sort of "real-time" web functionality to your ASP.NET application. Хотя чат часто используется в качестве примера, вы можете сделать многое еще.While chat is often used as an example, you can do a whole lot more. Каждый раз, когда пользователь обновляет веб-страницу для просмотра новых данных, или на странице реализован длинный опрос для получения новых данных, это является кандидатом на использование SignalR.Any time a user refreshes a web page to see new data, or the page implements long polling to retrieve new data, it is a candidate for using SignalR. Примеры включают панели мониторинга и приложения мониторинга, совместные приложения (например, одновременное редактирование документов), обновления хода выполнения заданий и формы в реальном времени.Examples include dashboards and monitoring applications, collaborative applications (such as simultaneous editing of documents), job progress updates, and real-time forms.

SignalR также обеспечивает совершенно новые типы веб-приложений, требующих высокой частоты обновления с сервера, например для игр в режиме реального времени.SignalR also enables completely new types of web applications that require high frequency updates from the server, for example, real-time gaming.

SignalR предоставляет простой API для создания удаленных вызовов процедур (RPC) "сервер-клиент", которые вызывают функции JavaScript в клиентских браузерах (и других клиентских платформах) из кода .NET на стороне сервера.SignalR provides a simple API for creating server-to-client remote procedure calls (RPC) that call JavaScript functions in client browsers (and other client platforms) from server-side .NET code. SignalR также включает API для управления подключениями (например, события подключения и отключения) и группирования соединений.SignalR also includes API for connection management (for instance, connect and disconnect events), and grouping connections.

Вызов методов с помощью SignalR

SignalR обрабатывает управление подключениями автоматически и позволяет рассылать сообщения на все подключенные клиенты одновременно, например в комнату чата.SignalR handles connection management automatically, and lets you broadcast messages to all connected clients simultaneously, like a chat room. Можно также отправить сообщения конкретным клиентам.You can also send messages to specific clients. Соединение между клиентом и сервером сохраняется, в отличие от классической HTTP-подключения, которое устанавливается заново для каждого обмена данными.The connection between the client and server is persistent, unlike a classic HTTP connection, which is re-established for each communication.

SignalR поддерживает функцию принудительной отправки с сервера, в которой серверный код может вызывать клиентский код в браузере с помощью удаленных вызовов процедур (RPC), а не модели «запрос-ответ», которая обычно используется в Интернете.SignalR supports "server push" functionality, in which server code can call out to client code in the browser using Remote Procedure Calls (RPC), rather than the request-response model common on the web today.

Приложения SignalR могут масштабироваться на тысячи клиентов, используя встроенные и сторонние сторонние поставщики.SignalR applications can scale out to thousands of clients using built-in, and third-party scale-out providers.

Встроенные поставщики включают:Built-in providers include:

Сторонние поставщики включают:Third-party providers include:

SignalR — открытый исходный код, доступный через GitHub.SignalR is open-source, accessible through GitHub.

SignalR и WebSocketSignalR and WebSocket

SignalR использует новый транспорт WebSocket, когда он доступен, и возвращается к более старым транспортам там, где это необходимо.SignalR uses the new WebSocket transport where available and falls back to older transports where necessary. Хотя вы, безусловно, можете написать свое приложение напрямую с помощью WebSocket, использование SignalR означает, что многие дополнительные функции, которые необходимо реализовать, уже выполнены.While you could certainly write your app using WebSocket directly, using SignalR means that a lot of the extra functionality you would need to implement is already done for you. Что важнее всего, это означает, что вы можете создать код приложения, чтобы воспользоваться преимуществами WebSocket, не заботясь о создании отдельного пути кода для старых клиентов.Most importantly, this means that you can code your app to take advantage of WebSocket without having to worry about creating a separate code path for older clients. SignalR также потребует от вас беспокоиться об обновлениях WebSocket, так как SignalR обновляется для поддержки изменений в базовом транспорте, предоставляя приложению согласованный интерфейс в разных версиях WebSocket.SignalR also shields you from having to worry about updates to WebSocket, since SignalR is updated to support changes in the underlying transport, providing your application a consistent interface across versions of WebSocket.

Транспорты и резервные вариантыTransports and fallbacks

SignalR является абстракцией для некоторых транспортов, необходимых для работы в режиме реального времени между клиентом и сервером.SignalR is an abstraction over some of the transports that are required to do real-time work between client and server. Подключение SignalR запускается как HTTP, а затем повышается до подключения WebSocket, если оно доступно.A SignalR connection starts as HTTP, and is then promoted to a WebSocket connection if it is available. WebSocket — это идеальный транспорт для SignalR, так как он обеспечивает наиболее эффективное использование памяти сервера, имеет наименьшую задержку и обладает самыми основными функциями (например, полным дуплексным обменом данными между клиентом и сервером), но обладает самым строгим требования. для WebSocket требуется, чтобы сервер использовал Windows Server 2012 или Windows 8, а также .NET Framework 4,5.WebSocket is the ideal transport for SignalR, since it makes the most efficient use of server memory, has the lowest latency, and has the most underlying features (such as full duplex communication between client and server), but it also has the most stringent requirements: WebSocket requires the server to be using Windows Server 2012 or Windows 8, and .NET Framework 4.5. Если эти требования не выполняются, то SignalR попытается использовать другие транспорты для создания подключений.If these requirements are not met, SignalR will attempt to use other transports to make its connections.

Транспорты HTML 5HTML 5 transports

Эти транспорты зависят от поддержки HTML 5.These transports depend on support for HTML 5. Если клиентский браузер не поддерживает стандарт HTML 5, будут использоваться старые транспорты.If the client browser does not support the HTML 5 standard, older transports will be used.

  • WebSocket (если как сервер, так и браузер указывают, что они могут поддерживать WebSocket).WebSocket (if both the server and browser indicate they can support Websocket). WebSocket — это единственный транспорт, который устанавливает истинное, двустороннее подключение между клиентом и сервером.WebSocket is the only transport that establishes a true persistent, two-way connection between client and server. Однако WebSocket также имеет самые строгие требования. Она полностью поддерживается только в последних версиях Microsoft Internet Explorer, Google Chrome и Mozilla Firefox и только частично реализована в других браузерах, таких как Opera и Safari.However, WebSocket also has the most stringent requirements; it is fully supported only in the latest versions of Microsoft Internet Explorer, Google Chrome, and Mozilla Firefox, and only has a partial implementation in other browsers such as Opera and Safari.
  • Сервер отправляет события, также известные как EventSource (если браузер поддерживает события, отправленные сервером, которые по сути являются всеми обозревателями, кроме Internet Explorer).Server Sent Events, also known as EventSource (if the browser supports Server Sent Events, which is basically all browsers except Internet Explorer.)

Транспорты CometComet transports

Следующие транспорты основаны на модели веб-приложения Comet , в которой браузер или другой клиент поддерживает ДЛИТЕЛЬный HTTP-запрос, который сервер может использовать для отправки данных клиенту без специального запроса клиента.The following transports are based on the Comet web application model, in which a browser or other client maintains a long-held HTTP request, which the server can use to push data to the client without the client specifically requesting it.

  • Непрерывная рамка (только для Internet Explorer).Forever Frame (for Internet Explorer only). Бесконечное кадры создает скрытый IFrame, который выполняет запрос к конечной точке на сервере, который не завершен.Forever Frame creates a hidden IFrame which makes a request to an endpoint on the server that does not complete. Затем сервер постоянно отправляет скрипт клиенту, который сразу же выполняется, предоставляя однонаправленное подключение к серверу в режиме реального времени от сервера к клиенту.The server then continually sends script to the client which is immediately executed, providing a one-way realtime connection from server to client. Соединение между клиентом и сервером использует отдельное соединение между сервером и клиентским соединением, как и стандартный HTTP-запрос, для каждого фрагмента данных, который необходимо отправить, создается новое соединение.The connection from client to server uses a separate connection from the server to client connection, and like a standard HTTP request, a new connection is created for each piece of data that needs to be sent.
  • Длинный опрос Ajax.Ajax long polling. Длительный опрос не создает постоянное подключение, а вместо этого опрашивает сервер с помощью запроса, который остается открытым, пока сервер не ответит, после чего соединение закрывается и сразу же запрашивается новое соединение.Long polling does not create a persistent connection, but instead polls the server with a request that stays open until the server responds, at which point the connection closes, and a new connection is requested immediately. Это может привести к задержке при сбросе соединения.This may introduce some latency while the connection resets.

Дополнительные сведения о поддержке транспортов при настройке см. в разделе Поддерживаемые платформы.For more information on what transports are supported under which configurations, see Supported Platforms.

Процесс выбора транспортаTransport selection process

В следующем списке показаны действия, которые использует SignalR для выбора используемого транспорта.The following list shows the steps that SignalR uses to decide which transport to use.

  1. Если браузер Internet Explorer 8 или более ранней версии, используется длинный опрос.If the browser is Internet Explorer 8 or earlier, Long Polling is used.

  2. Если настроено JSONP (то есть параметр jsonp имеет значение true при запуске соединения), используется длинный опрос.If JSONP is configured (that is, the jsonp parameter is set to true when the connection is started), Long Polling is used.

  3. Если выполняется междоменное подключение (то есть если конечная точка SignalR не находится в том же домене, что и страница размещения), то при соблюдении следующих условий будет использоваться WebSocket.If a cross-domain connection is being made (that is, if the SignalR endpoint is not in the same domain as the hosting page), then WebSocket will be used if the following criteria are met:

    • Клиент поддерживает CORS (совместное использование ресурсов между источниками).The client supports CORS (Cross-Origin Resource Sharing). Дополнительные сведения о том, какие клиенты поддерживают CORS, см. в разделе CORS по адресу caniuse.com.For details on which clients support CORS, see CORS at caniuse.com.

    • Клиент поддерживает WebSocketThe client supports WebSocket

    • Сервер поддерживает WebSocketThe server supports WebSocket

      Если какое бы то ни было условие не выполнено, будет использоваться длинный опрос.If any of these criteria are not met, Long Polling will be used. Дополнительные сведения о междоменных соединениях см. в разделе как установить междоменное подключение.For more information on cross-domain connections, see How to establish a cross-domain connection.

  4. Если JSONP не настроен и соединение не является междоменным, будет использоваться WebSocket, если клиент и сервер его поддерживают.If JSONP is not configured and the connection is not cross-domain, WebSocket will be used if both the client and server support it.

  5. Если клиент или сервер не поддерживают WebSocket, то используются события отправки сервера, если они доступны.If either the client or server do not support WebSocket, Server Sent Events is used if it is available.

  6. Если события отправки сервера недоступны, предпринимается неограниченная рамка.If Server Sent Events is not available, Forever Frame is attempted.

  7. Если непостоянное выполнение кадра завершается сбоем, используется длинный опрос.If Forever Frame fails, Long Polling is used.

Мониторинг транспортаMonitoring transports

Вы можете определить, какой транспорт использует приложение, включив ведение журнала в центре и открыв окно консоли в браузере.You can determine what transport your application is using by enabling logging on your hub, and opening the console window in your browser.

Чтобы включить ведение журнала для событий концентратора в браузере, добавьте следующую команду в клиентское приложение:To enable logging for your hub's events in a browser, add the following command to your client application:

$.connection.hub.logging = true;

  • В Internet Explorer откройте Инструменты разработчика, нажав клавишу F12, и перейдите на вкладку консоль.In Internet Explorer, open the developer tools by pressing F12, and click the Console tab.

    Консоль в Microsoft Internet Explorer

  • В Chrome откройте консоль, нажав клавиши Ctrl + Shift + J.In Chrome, open the console by pressing Ctrl+Shift+J.

    Консоль в Google Chrome

После открытия консоли и включения ведения журнала вы сможете увидеть, какой транспорт используется SignalR.With the console open and logging enabled, you'll be able to see which transport is being used by SignalR.

Консоль в Internet Explorer с отображением протокола WebSocket

Указание транспортаSpecifying a transport

Согласование транспорта занимает определенное время и ресурсы клиента и сервера.Negotiating a transport takes a certain amount of time and client/server resources. Если известны возможности клиента, можно указать транспорт при запуске клиентского соединения.If the client capabilities are known, then a transport can be specified when the client connection is started. В следующем фрагменте кода показано, как запустить соединение с помощью транспортного транспорта AJAX с длинным опросом, как было бы использовано, если известно, что клиент не поддерживал какой-либо другой протокол:The following code snippet demonstrates starting a connection using the Ajax Long Polling transport, as would be used if it was known that the client did not support any other protocol:

connection.start({ transport: 'longPolling' });

Можно указать резервный порядок, если требуется, чтобы клиент попробно протестировать определенные транспорты по порядку.You can specify a fallback order if you want a client to try specific transports in order. В следующем фрагменте кода демонстрируется попытка выполнить WebSocket и отработка отказа, которая сразу же проходит к длительному опросу.The following code snippet demonstrates trying WebSocket, and failing that, going directly to Long Polling.

connection.start({ transport: ['webSockets','longPolling'] });

Строковые константы для указания транспортов определяются следующим образом:The string constants for specifying transports are defined as follows:

  • webSockets
  • foreverFrame
  • serverSentEvents
  • longPolling

Подключения и концентраторыConnections and Hubs

API SignalR содержит две модели взаимодействия между клиентами и серверами: постоянные подключения и концентраторы.The SignalR API contains two models for communicating between clients and servers: Persistent Connections and Hubs.

Соединение представляет собой простую конечную точку для отправки сообщений одного получателя, сгруппированных или широковещательных.A Connection represents a simple endpoint for sending single-recipient, grouped, or broadcast messages. API постоянного подключения (представленный в коде .NET классом Персистентконнектион) предоставляет разработчику прямой доступ к протоколу обмена данными низкого уровня, предоставляемому SignalR.The Persistent Connection API (represented in .NET code by the PersistentConnection class) gives the developer direct access to the low-level communication protocol that SignalR exposes. Использование модели взаимодействия подключений будет знакомо разработчикам, использующим API-интерфейсы на основе подключений, например Windows Communication Foundation.Using the Connections communication model will be familiar to developers who have used connection-based APIs such as Windows Communication Foundation.

Концентратор — это высокоуровневый конвейер, построенный на основе API подключения, который позволяет клиенту и серверу вызывать методы напрямую.A Hub is a more high-level pipeline built upon the Connection API that allows your client and server to call methods on each other directly. SignalR обрабатывает расходящиеся между компьютерами границы, как если бы они были различными волшебями, позволяя клиентам вызывать методы на сервере так же легко, как локальные методы, и наоборот.SignalR handles the dispatching across machine boundaries as if by magic, allowing clients to call methods on the server as easily as local methods, and vice versa. Использование модели взаимодействия центров будет знакомо разработчикам, которые использовали API удаленного вызова, такие как удаленное взаимодействие .NET.Using the Hubs communication model will be familiar to developers who have used remote invocation APIs such as .NET Remoting. Использование концентратора также позволяет передавать методам строго типизированные параметры, включая привязку модели.Using a Hub also allows you to pass strongly typed parameters to methods, enabling model binding.

Диаграмма архитектурыArchitecture diagram

На следующей схеме показана связь между концентраторами, постоянными подключениями и базовыми технологиями, используемыми для транспортов.The following diagram shows the relationship between Hubs, Persistent Connections, and the underlying technologies used for transports.

Схема архитектуры SignalR, показывающая интерфейсы API, транспорт и клиенты

Как работают концентраторыHow Hubs work

Когда код на стороне сервера вызывает метод на клиенте, пакет отправляется через активный транспорт, содержащий имя и параметры вызываемого метода (когда объект отправляется в качестве параметра метода, он сериализуется с помощью JSON).When server-side code calls a method on the client, a packet is sent across the active transport that contains the name and parameters of the method to be called (when an object is sent as a method parameter, it is serialized using JSON). Затем клиент сопоставляет имя метода с методами, определенными в коде на стороне клиента.The client then matches the method name to methods defined in client-side code. При наличии совпадения клиентский метод будет выполнен с использованием десериализованных данных параметра.If there is a match, the client method will be executed using the deserialized parameter data.

Для отслеживания вызова метода можно использовать такие средства , как Fiddler.The method call can be monitored using tools like Fiddler. На следующем рисунке показан вызов метода, отправленный с сервера SignalR в клиент веб-браузера на панели журналы в Fiddler.The following image shows a method call sent from a SignalR server to a web browser client in the Logs pane of Fiddler. Вызов метода отправляется из центра с именем MoveShapeHub, а вызываемый метод называется updateShape.The method call is being sent from a hub called MoveShapeHub, and the method being invoked is called updateShape.

Представление журнала Fiddler, показывающего трафик SignalR

В этом примере имя концентратора определяется с помощью параметра H. имя метода определяется с помощью параметра M, а отправляемые в метод данные идентифицируются с помощью параметра A.In this example, the hub name is identified with the H parameter; the method name is identified with the M parameter, and the data being sent to the method is identified with the A parameter. Приложение, создавшее это сообщение, создается в руководстве с высокой частотой в реальном времени .The application that generated this message is created in the High-Frequency Realtime tutorial.

Выбор модели связиChoosing a communication model

Большинство приложений должны использовать API концентраторов.Most applications should use the Hubs API. API подключений можно использовать в следующих случаях.The Connections API could be used in the following circumstances:

  • Необходимо указать формат фактического отправленного сообщения.The format of the actual message sent needs to be specified.
  • Разработчик предпочитает работать с системой обмена сообщениями и моделью диспетчеризации, а не с помощью удаленной модели вызова.The developer prefers to work with a messaging and dispatching model rather than a remote invocation model.
  • Существующее приложение, использующее модель обмена сообщениями, переносится на использование SignalR.An existing application that uses a messaging model is being ported to use SignalR.