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


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

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

Инструкции, которые добавляются в инструкции или заменяются инструкциями в этой статье, см. в ASP.NET основных BlazorSignalR руководствах.BlazorSignalR

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

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

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

Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код в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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 помощью метода в клиенте HttpHubConnectionBuilderJava. Клиент Java по умолчанию использует транспорт WebSockets.

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

Примечание.

Клиент SignalR Java пока не поддерживает резервную передачу транспорта.

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

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

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

Вариант Значение по умолчанию Description
WithServerTimeout 30 секунд (30 000 миллисекунд) Время ожидания для действия сервера и устанавливается непосредственно в HubConnectionBuilder. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, двойное значение интервалаWithKeepAliveInterval () сервера, чтобы разрешить время поступления ping.
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 байт.

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

      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 Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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 центров:

Вариант Значение по умолчанию Description
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 "Проверка подлинности носителя" (использование Authorization заголовка с типом Bearer). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 "Проверка подлинности носителя" (использование Authorization заголовка с типом Bearer). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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.Json JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код в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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 помощью метода в клиенте HttpHubConnectionBuilderJava. Клиент Java по умолчанию использует транспорт WebSockets.

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

Примечание.

Клиент SignalR Java пока не поддерживает резервную передачу транспорта.

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

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

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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.Json JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код в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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 помощью метода в клиенте HttpHubConnectionBuilderJava. Клиент Java по умолчанию использует транспорт WebSockets.

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

Примечание.

Клиент SignalR Java пока не поддерживает резервную передачу транспорта.

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

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

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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.Json JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код в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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 помощью метода в клиенте HttpHubConnectionBuilderJava. Клиент Java по умолчанию использует транспорт WebSockets.

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

Примечание.

Клиент SignalR Java пока не поддерживает резервную передачу транспорта.

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

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

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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.Json JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код в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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 помощью метода в клиенте HttpHubConnectionBuilderJava. Клиент Java по умолчанию использует транспорт WebSockets.

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

Примечание.

Клиент SignalR Java пока не поддерживает резервную передачу транспорта.

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

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

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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.Json JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.

Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код в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 центров:

Вариант Значение по умолчанию Description
ClientTimeoutInterval 30 секунд Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval .
HandshakeTimeout 15 секунд Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора.
KeepAliveInterval 15 секунд Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении 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:

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

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

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

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

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

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

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

Настройка журнала

Ведение журнала настраивается в клиенте ConfigureLogging .NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по 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 помощью метода в клиенте HttpHubConnectionBuilderJava. Клиент Java по умолчанию использует транспорт WebSockets.

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

Примечание.

Клиент SignalR Java пока не поддерживает резервную передачу транспорта.

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

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

В клиенте AccessTokenProvider .NET можно указать параметр с помощью делегата параметров в 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. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.

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

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

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

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

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

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

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

Параметр .NET Значение по умолчанию Description
AccessTokenProvider null Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в 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();

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