Создание и конфигурация хабов

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 24.12.2019

Ключевой сущностью в SignalR, через которую клиенты обмениваются сообщеними с сервером и между собой, является хаб (hub), который представляет некоторый класс, унаследованный от абстрактного класса Microsoft.AspNetCore.SignalR.Hub.

Простейший хаб:

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

namespace SignalRApp
{
    public class ChatHub : Hub
    {
        public async Task Send(string message)
        {
            await Clients.All.SendAsync("Send", message);
        }
    }
}

Класс хаба может определять различные методы с различными параметрами, однако клиент может обращаться только к публичным методам хаба. Например, в данном случае определен публичный метод Send, который принимает параметр типа string. А это значит, что клиент может вызвать на хабе этот метод и передать ему некоторую строку. Метод может содержать различную логику, но в данном случае метод просто транслирует полученную строку всех подключенным клиентам.

AddSignalR()

Сам по себе SignalR не будет работать, чтобы хаб был доступен для использования, в методе ConfigureServices() класса Startup вызывает метод services.AddSignalR():

public void ConfigureServices(IServiceCollection services)
{
	services.AddSignalR();
}

Перегузка этого метода принимает в качестве параметра делегат Action, который имеет параметр типа HubOptions. Данный параметр позволяет сконфигурировать подключение хаба. В частности, класс HubOptions определяет ряд свойств:

  • ClientTimeoutInterval. Определяет время, в течение которого клиент должен отправить серверу сообщение. Если в течение данного времени никаких сообщенй от клиента на сервер не пришло, то сервер закрывает соединение.

    По умолчанию равно 30 секунд.

  • HandshakeTimeout. После подключения к серверу клиент должен отправить серверу в качестве самого первого сообщения специальное сообщение - HandshakeRequest. Это свойство устанавливает допустимое время таймаута, которое может пройти до получения от клиента первого сообщения об установки соединения. Если в течение этого периода клиент не отправит первое сообщение, то подключение закрывается.

    По умолчанию равно 15 секунд.

  • KeepAliveInterval: если в течение этого периода сервер не отправит никаких сообшений, то автоматически отправляется ping-сообщение для поддержания подключения открытым. При изменении этого свойства Microsoft рекомендует изменить на стророне клиента параметр serverTimeoutInMilliseconds (клиент javascript)/ ServerTimeout(клиент .NET), которое рекомендуется устанавливать в два раза больше, чем KeepAliveInterval.

    По умолчанию равно 15 секунд.

  • SupportedProtocols определяет поддерживаемые протоколы. По умолчанию поддерживаются все протоколы.

  • EnableDetailedErrors при значении true возвращает клиенту детальное описание возникшей ошибки (при ее возникновении). Поскольку подобные сообщения могут содержать критически важную для безопасности информацию, то по умолчанию имеет значение false.

Мы можем настроить параметры глобально для всех хабов в приложении, либо для хабов отдельного типа. Глобальная настройка хабов:

public void ConfigureServices(IServiceCollection services)
{
	services.AddSignalR(hubOptions =>
	{
		hubOptions.EnableDetailedErrors = true;
		hubOptions.KeepAliveInterval = System.TimeSpan.FromMinutes(1);
	});
}

Настройка только для хаба ChatHub:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
	options.EnableDetailedErrors = true;
	options.KeepAliveInterval = System.TimeSpan.FromMinutes(1);
});

MapHub

Чтобы сервер мог сопоставить запросы с определенным хабом, в методе Configure() класса Startup для сопоставления определенного маршрута с определенным хабом вызывается метод MapHub():

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace SignalRApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseDeveloperExceptionPage();

            app.UseDefaultFiles();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapHub<ChatHub>("/chat");
            });
        }
    }
}

С помощью метода MapHub() можно сопоставить URL с хабом. В данном случае все запросы по адресу "/chat" будут обрабатываться хабом ChatHub.

Перегрузка метода MapHub дополнительно принимает делегат с параметром типа HttpConnectionDispatcherOptions, благодаря чему мы можем настроить различные настройки подключения. В частности, в HttpConnectionDispatcherOptions есть следующие свойства:

  • ApplicationMaxBufferSize: максимальный размер буфера в байтах, в который сервер помещает получаемые от клиента данные.

    По умолчанию равно 32 килобайта.

  • AuthorizationData: представляет список (объект IList) объектов IAuthorizeData, которые определяют, авторизован ли клиент для подключения к хабу.

  • TransportMaxBufferSize максимальный размер буфера в байтах, в который сервер помещает данные для отправки клиенту.

    По умолчанию равно 32 килобайта.

  • Transports представляет битовую маску из значений перечисления HttpTransportType, которая устанавливает допустимые типы транспорта. По умолчанию применяются все типы транспорта

  • LongPolling представляет объект LongPollingOptions, который настраивает транспорт LongPolling. Этот класс имеет только одно свойство PollTimeout, которое устанавливает периодичность опроса

  • WebSockets представляет объект Microsoft.AspNetCore.Http.Connections.WebSocketOptions, который настраивает транспорт WebSocket.

Применим некоторые свойства:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http.Connections;

namespace SignalRApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseDeveloperExceptionPage();

            app.UseDefaultFiles();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapHub<ChatHub>("/chat",
                    options => {
                        options.ApplicationMaxBufferSize = 64;
                        options.TransportMaxBufferSize = 64;
                        options.LongPolling.PollTimeout = System.TimeSpan.FromMinutes(1);
                        options.Transports = HttpTransportType.LongPolling | HttpTransportType.WebSockets;
                    });
            });
        }
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850