Поделиться через


Конфигурация SignalR ASP.NET Core

В этой статье рассматривается конфигурация ASP.NET Core SignalR.

Для получения руководств, которые дополняют или заменяют инструкции в этой статье, см. руководства ASP.NET CoreBlazorSignalR.BlazorSignalR

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol. AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Переключитесь на Newtonsoft.Json

Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval .
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.
StreamBufferCapacity 10 Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока.
MaximumReceiveMessageSize 32 КБ Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS).
MaximumParallelInvocationsPerClient 1 Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь.
DisableImplicitFromServicesParameters false Если это возможно, аргументы метода концентратора разрешаются из DI.

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Program.cs.

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 64 КБ Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти.
TransportMaxBufferSize 64 КБ Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.
MinimumProtocolVersion 0 Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий.
CloseOnAuthenticationExpiration неправда Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.

Струна LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info илиinformation LogLevel.Information
warn илиwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Замечание

Клиент SignalR Java пока не поддерживает резервный механизм передачи.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и режима поддержания активного соединения.

Вариант Значение по умолчанию Описание
WithServerTimeout 30 секунд (30 000 миллисекунд) Тайм-аут для активности сервера устанавливается непосредственно на HubConnectionBuilder. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение должно быть числом, как минимум вдвое больше интервала поддержания соединения сервера (WithKeepAliveInterval), чтобы обеспечить время для поступления пингов.
HandshakeTimeout 15 секунд Время ожидания для начальной установки соединения с сервером и доступно на самом объекте HubConnection. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
WithKeepAliveInterval 15 секунд Определяет интервал, с помощью которого клиент отправляет сообщения с связью и устанавливается непосредственно в HubConnectionBuilderней. Этот параметр позволяет серверу обнаруживать жесткие отключения, например, когда клиент отключает компьютер из сети. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

В следующем примере показаны значения, которые являются двойными значениями по умолчанию:

var builder = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"))
    .WithServerTimeout(TimeSpan.FromSeconds(60))
    .WithKeepAliveInterval(TimeSpan.FromSeconds(30))
    .Build();

builder.On<string, string>("ReceiveMessage", (user, message) => ...

await builder.StartAsync();

Настройка повторного подключения с отслеживанием состояния

SignalR Подключение с сохранением состояния уменьшает воспринимаемое время простоя клиентов, имеющих временное отключение в сетевом подключении, например, при переключении сетевых подключений или временной потере доступа.

Для достижения этого используется осознанное повторное подключение:

  • Временное буферирование данных на сервере и клиенте.
  • Подтверждение полученных сообщений (ACK-ing) как сервером, так и клиентом.
  • Обнаружение восстановления подключения и повторная передача сообщений, которые могли быть отправлены во время его отсутствия.

Повторное подключение с отслеживанием состояния доступно в ASP.NET Core 8.0 и новее.

Войдите на повторное подключение с отслеживанием состояния как в конечной точке концентратора сервера, так и в клиенте:

  • Обновите конфигурацию конечной точки концентратора сервера, чтобы включить AllowStatefulReconnects параметр.

    app.MapHub<MyHub>("/hubName", options =>
    {
        options.AllowStatefulReconnects = true;
    });
    

    При необходимости максимальный размер буфера в байтах, разрешенных сервером, можно задать глобально или для определенного концентратора с параметром StatefulReconnectBufferSize :

    Глобальный StatefulReconnectBufferSize набор параметров:

    builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
    

    Набор StatefulReconnectBufferSize параметров для определенного концентратора:

    builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
    

    Этот StatefulReconnectBufferSize параметр является необязательным с значением по умолчанию 100 000 байт.

  • Обновите клиентский withStatefulReconnect код JavaScript или TypeScript, чтобы включить этот параметр:

    const builder = new signalR.HubConnectionBuilder()
      .withUrl("/hubname")
      .withStatefulReconnect({ bufferSize: 1000 });  // Optional, defaults to 100,000
    const connection = builder.build();
    

    Этот bufferSize параметр является необязательным с значением по умолчанию 100 000 байт.

  • Обновите код .NET клиента, чтобы включить параметр WithStatefulReconnect.

      var builder = new HubConnectionBuilder()
          .WithUrl("<hub url>")
          .WithStatefulReconnect();
      builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000);
      var hubConnection = builder.Build();
    

    Этот StatefulReconnectBufferSize параметр является необязательным с значением по умолчанию 100 000 байт.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите это значение на true, чтобы пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.
ApplicationMaxBufferSize 1 МБ Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти.
TransportMaxBufferSize 1 МБ Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

Сериализация JSON может быть конфигурирована на сервере с помощью метода расширения AddJsonProtocol, который можно добавить после AddSignalR в вашем методе Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings , который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.

Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код в Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval .
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если trueподробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.

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

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 32 КБ Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу получать более крупные сообщения, но может негативно повлиять на потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
TransportMaxBufferSize 32 КБ Максимальное количество байтов, отправляемых приложением и буферизуемых сервером. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval, чтобы обеспечить время для прибытия эхо-запросов.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

Сериализация JSON может быть конфигурирована на сервере с помощью метода расширения AddJsonProtocol, который можно добавить после AddSignalR в вашем методе Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings , который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.

Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код в Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval.
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.

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

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 32 КБ Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу получать более крупные сообщения, но может негативно повлиять на потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
TransportMaxBufferSize 32 КБ Максимальное количество байтов, отправляемых приложением и буферизуемых сервером. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания активности сервера истекло. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим, чтобы сообщение ping было отправлено с сервера и получено клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, как минимум вдвое превышающее значение сервера KeepAliveInterval, чтобы обеспечить прибытие ping-запросов вовремя.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol. AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Переключитесь на Newtonsoft.Json

Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval.
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.
StreamBufferCapacity 10 Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока.
MaximumReceiveMessageSize 32 КБ Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS).

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.

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

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 32 КБ Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
TransportMaxBufferSize 32 КБ Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.

Струна LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info илиinformation LogLevel.Information
warn илиwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Замечание

Клиент SignalR Java пока не поддерживает резервный механизм передачи.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval, чтобы обеспечить время для прибытия эхо-запросов.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol. AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Переключитесь на Newtonsoft.Json

Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval.
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.
StreamBufferCapacity 10 Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока.
MaximumReceiveMessageSize 32 КБ Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS).

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.

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

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 32 КБ Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
TransportMaxBufferSize 32 КБ Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, без ожидания обратного давления, но может увеличить потребление памяти.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.
MinimumProtocolVersion 0 Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.

Струна LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info илиinformation LogLevel.Information
warn илиwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Замечание

Клиент SignalR Java пока не поддерживает резервный механизм передачи.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval, чтобы обеспечить время для прибытия эхо-запросов.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol. AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Переключитесь на Newtonsoft.Json

Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval.
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.
StreamBufferCapacity 10 Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока.
MaximumReceiveMessageSize 32 КБ Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS).
MaximumParallelInvocationsPerClient 1 Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь.

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.

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

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 32 КБ Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
TransportMaxBufferSize 32 КБ Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, без ожидания обратного давления, но может увеличить потребление памяти.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.
MinimumProtocolVersion 0 Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.

Струна LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info илиinformation LogLevel.Information
warn илиwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Замечание

Клиент SignalR Java пока не поддерживает резервный механизм передачи.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval, чтобы обеспечить время для прибытия эхо-запросов.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol. AddJsonProtocol можно добавить после AddSignalR в Program.cs. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Переключитесь на Newtonsoft.Json

Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval.
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.
StreamBufferCapacity 10 Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока.
MaximumReceiveMessageSize 32 КБ Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS).
MaximumParallelInvocationsPerClient 1 Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь.

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Program.cs.

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 64 КБ Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти.
TransportMaxBufferSize 64 КБ Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.
MinimumProtocolVersion 0 Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий.
CloseOnAuthenticationExpiration неправда Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.

Струна LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info илиinformation LogLevel.Information
warn илиwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Замечание

Клиент SignalR Java пока не поддерживает резервный механизм передачи.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval, чтобы обеспечить время для прибытия эхо-запросов.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.
ApplicationMaxBufferSize 1 МБ Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти.
TransportMaxBufferSize 1 МБ Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы

Параметры сериализации JSON/MessagePack

ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.

На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol. AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Замечание

В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.

Переключитесь на Newtonsoft.Json

Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".

Параметры сериализации MessagePack

Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.

Замечание

В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.

Настройка параметров сервера

В следующей таблице описаны опции настройки SignalR хабов.

Вариант Значение по умолчанию Описание
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval.
SupportedProtocols Все установленные протоколы Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров.
EnableDetailedErrors false Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию.
StreamBufferCapacity 10 Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока.
MaximumReceiveMessageSize 32 КБ Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS).
MaximumParallelInvocationsPerClient 1 Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь.
DisableImplicitFromServicesParameters false Если это возможно, аргументы метода хаба будут разрешены из DI.

Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Program.cs.

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Дополнительные параметры конфигурации HTTP

Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:

Вариант Значение по умолчанию Описание
ApplicationMaxBufferSize 64 КБ Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти.
TransportMaxBufferSize 64 КБ Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти.
AuthorizationData Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру.
Transports Все транспорты включены. Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения.
LongPolling См. ниже. Дополнительные параметры, специфичные для транспорта Long Polling.
WebSockets См. ниже. Дополнительные параметры, относящиеся к транспорту WebSockets.
MinimumProtocolVersion 0 Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий.
CloseOnAuthenticationExpiration неправда Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена.

Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.

Вариант Значение по умолчанию Описание
PollTimeout 90 секунд Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса.

Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:

Вариант Значение по умолчанию Описание
CloseTimeout 5 секунд После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается.
SubProtocolSelector null Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение.

Настройка параметров клиента

Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.

Настройка логирования

Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.

Замечание

Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».

Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.

Струна LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info илиinformation LogLevel.Information
warn илиwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Замечание

Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .

Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.

Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging его с клиентом SignalR Java.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это предупреждение можно игнорировать.

Настройка разрешенных транспортов

Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.

Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

В этой версии клиента Java WebSockets является единственным доступным транспортом.

В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Замечание

Клиент SignalR Java пока не поддерживает резервный механизм передачи.

Настройка проверки подлинности носителя

Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Настройте параметры времени ожидания и режим поддержания соединения

Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :

Вариант Значение по умолчанию Описание
ServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval, чтобы обеспечить время для прибытия эхо-запросов.
HandshakeTimeout 15 секунд Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен.

В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.

Настройка дополнительных параметров

Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.

Опция .NET Значение по умолчанию Описание
AccessTokenProvider null Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах.
SkipNegotiation false Установите true для пропуска шага согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR .
ClientCertificates Пусто Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов.
Cookies Пусто Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом.
Credentials Пусто Учетные данные для отправки с каждым HTTP-запросом.
CloseTimeout 5 секунд Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается.
Headers Пусто Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом.
HttpMessageHandlerFactory null Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику.
Proxy null Прокси-сервер HTTP, используемый при отправке HTTP-запросов.
UseDefaultCredentials false Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows.
WebSocketConfiguration null Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров.
ApplicationMaxBufferSize 1 МБ Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти.
TransportMaxBufferSize 1 МБ Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти.

В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Дополнительные ресурсы