Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается настройка параметров клиента и сервера для ASP.NET Core SignalR.
Для получения руководств, которые дополняют или заменяют инструкции в этой статье, см. Blazor.SignalRBlazor
Настройка сериализации для кодирования сообщений
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Параметры сериализации JSON
Сериализацию JSON можно настроить на сервере с помощью метода расширения AddJsonProtocol.
AddJsonProtocol можно добавить после AddSignalR метода в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы он не изменял регистр имен свойств, а использовал вместо имен свойств в стиле camel case, применяемых по умолчанию, следующий код в файле 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. Дополнительные сведения см. в MessagePack в SignalR.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получает сообщение (включая сохранение активности) в течение этого интервала. Из-за особенностей реализации этой функции клиент может быть помечен как отключенный позже, чем истечет этот интервал тайм-аута. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Этот параметр является расширенной настройкой и должен изменяться только в том случае, если возникают ошибки тайм-аута при рукопожатии из-за значительной сетевой задержки. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Интервал, через который автоматически отправляется ping-сообщение для поддержания соединения открытым. При изменении значения KeepAliveInterval измените параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если этот параметр включен (true), подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 | Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. По достижении этого ограничения обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. Обратите внимание, что это ограничение не применяется к вызовам концентратора потоковой передачи. Дополнительные сведения см. в разделе Использование центров в ASP.NET Core SignalR. |
DisableImplicitFromServicesParameters |
false |
Аргументы метода хаба разрешаются через механизм внедрения зависимостей, если это возможно. |
Параметры можно настроить для всех концентраторов, передав делегат параметров в вызов AddSignalR в файле Program.cs.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые AddSignalR и можно настроить с помощью AddHubOptions метода:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Настройка расширенных параметров HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата в метод MapHub в Program.cs.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. раздел «Настройка транспорта Long Polling» | Параметры, специфичные для транспорта Long Polling. |
WebSockets |
См . раздел "Настройка транспорта WebSocket" | Параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Минимальная версия протокола согласования. Это значение используется для ограничения клиентов более новыми версиями протокола. |
CloseOnAuthenticationExpiration |
false |
Управляет отслеживанием истечения срока действия аутентификации, обеспечивая закрытие соединений при истечении срока действия токена. |
Настройте транспорт длинного опроса
У транспорта Long Polling есть и другие параметры, которые можно настроить с помощью свойства LongPolling:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Настройка транспорта WebSocket
Транспорт WebSocket имеет другие параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
В клиенте .NET и клиенте JavaScript параметры клиента настраиваются в типе HubConnectionBuilder. В клиенте Java параметры настраиваются в подклассе HttpHubConnectionBuilder, который содержит параметры конфигурации построителя и сам HubConnection.
Настройка логирования
Ведение журнала настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации Ведение журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Дополнительные сведения см. в полном списке встроенных поставщиков ведения журнала.
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение LogLevel в качестве минимального уровня выводимых сообщений журнала. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel можно также указать значение string, представляющее имя уровня журнала. Этот подход полезен при настройке журналирования SignalR в средах, где у вас нет доступа к константам LogLevel.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Значение, которое вы указываете для configureLogging, задаёт минимальный уровень журналирования. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, регистрируются.
| Струна | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в разделе Logging и диагностика в ASP.NET Core SignalR.
Клиент Java SignalR использует библиотеку Simple Logging Facade for Java (SLF4J) для ведения журналов. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Вы можете спокойно игнорировать это сообщение.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с помощью метода withTransport в HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент Java SignalR в настоящее время не поддерживает резервный вариант транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передаётся как HTTP-токен "Bearer Authentication" (с использованием заголовка Authorization и типа Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив поставщику маркера доступа HttpHubConnectionBuilder. Используйте withAccessTokenProvider, чтобы предоставить RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
В этом разделе описаны другие параметры настройки времени ожидания и поведения в режиме поддержания активности.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
WithServerTimeout |
30 секунд (30 000 миллисекунд) | Значение времени ожидания для активности сервера, которое задается непосредственно в HubConnectionBuilder. Если сервер не отправляет сообщение в течение этого интервала, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение должно быть числом, как минимум вдвое больше интервала поддержания соединения сервера (WithKeepAliveInterval), чтобы обеспечить время для поступления пингов. |
HandshakeTimeout |
15 секунд | Значение времени ожидания для начального рукопожатия с сервером, доступное непосредственно в самом объекте HubConnection. Если сервер не отправляет ответ на рукопожатие в течение этого интервала, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Этот параметр относится к расширенным настройкам и должен изменяться только в том случае, если из-за высокой сетевой задержки возникают ошибки тайм-аута при установлении соединения. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
WithKeepAliveInterval |
15 секунд | Это значение определяет интервал, с которым клиент отправляет пинг-сообщения, и задаётся непосредственно на HubConnectionBuilder. Этот параметр позволяет серверу обнаруживать жесткие отключения, например, когда клиент отключает компьютер из сети. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправляет сообщение в течение времени, заданного на сервере (ClientTimeoutInterval), сервер считает клиента отключённым. |
В клиенте .NET значения времени ожидания указываются как значения TimeSpan.
В следующем примере показаны значения, которые являются двойными значениями по умолчанию:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.WithServerTimeout(TimeSpan.FromSeconds(60))
.WithKeepAliveInterval(TimeSpan.FromSeconds(30))
.Build();
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
Настройка повторного подключения с отслеживанием состояния
SignalR Повторное подключение с сохранением состояния уменьшает ощущаемое время простоя для клиентов, у которых временно прерывается сетевое подключение, например при переключении между сетевыми подключениями или кратковременной потере доступа.
Повторное подключение с сохранением состояния позволяет добиться воспринимаемого времени простоя за счёт следующего:
- Временное буферирование данных на сервере и клиенте.
- Подтверждение полученных сообщений (ACK-ing) как сервером, так и клиентом.
- Распознавание момента, когда соединение установлено, и повторная отправка сообщений, которые могли быть отправлены, пока соединение было недоступно.
Повторное подключение с сохранением состояния доступно в .NET 8 или более поздней версии.
Включить переподключение с сохранением состояния
Вы можете включить поддержку повторного подключения с сохранением состояния как в конечной точке серверного концентратора, так и на клиенте.
В конечной точке концентратора на сервере обновите конфигурацию, чтобы включить параметр
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 байт.На стороне клиента обновите код JavaScript или TypeScript, чтобы включить параметр
withStatefulReconnect:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();Параметр
bufferSizeнеобязателен с размером по умолчанию 100 000 байт.В клиенте .NET обновите код, чтобы включить параметр
WithStatefulReconnect:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();Параметр
StatefulReconnectBufferSizeнеобязателен с размером по умолчанию 100 000 байт.
Настройка других параметров
Другие параметры можно настроить в методе WithUrl (withUrl в JavaScript) в HubConnectionBuilder или в различных API конфигурации HttpHubConnectionBuilder в клиенте Java.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого параметра значение true, чтобы пропустить этап согласования. Примечание. Этот параметр доступен только в том случае, если транспорт WebSockets является единственным включенным транспортом. Параметр нельзя включить при использовании службы Azure SignalR. |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки для проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. Примечание. Этот параметр доступен только для WebSockets. |
Headers |
Пусто | Карта других заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Вы можете либо изменить параметры этого значения по умолчанию и вернуть его, либо вернуть новый экземпляр HttpMessageHandler. Примечание. — При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика. В противном случае настроенные параметры (например, файлы cookie и заголовки) не применяются к новому обработчику. — Этот параметр не используется для подключений WebSocket. |
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();
Связанный контент
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть конфигурирована на сервере с помощью метода расширения AddJsonProtocol, который можно добавить после AddSignalR в вашем методе Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings , который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.
Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код в Startup.ConfigureServices:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу получать более крупные сообщения, но может негативно повлиять на потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправляемых приложением и буферизуемых сервером. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть конфигурирована на сервере с помощью метода расширения AddJsonProtocol, который можно добавить после AddSignalR в вашем методе Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings , который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.
Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код в Startup.ConfigureServices:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу получать более крупные сообщения, но может негативно повлиять на потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправляемых приложением и буферизуемых сервером. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
| Струна | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
| Струна | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. |
Замечание
MaximumParallelInvocationsPerClient не применяется к вызовам концентратора потоковой передачи. Ожидается, что потоковые вызовы будут долговременными и могут выполняться параллельно. Используйте фильтры концентратора, чтобы задать ограничения параллелизма потоковой передачи для каждого подключения.
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
| Струна | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol можно добавить после AddSignalR в Program.cs. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. |
Замечание
MaximumParallelInvocationsPerClient не применяется к вызовам концентратора потоковой передачи. Ожидается, что потоковые вызовы будут выполняться длительное время и могут выполняться параллельно. Используйте фильтры хаба, чтобы задать ограничения на параллелизм потоковой передачи для каждого подключения.
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Program.cs.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
CloseOnAuthenticationExpiration |
неправда | Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
| Струна | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrlследующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrlследующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol можно добавить после AddSignalR в Startup.ConfigureServices. Метод AddJsonProtocol принимает делегат, который получает объект options. Свойство PayloadSerializerOptions этого объекта — это System.Text.JsonJsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json , которые не поддерживаются System.Text.Json, см. раздел "Переключиться на Newtonsoft.Json".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false, поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. Это ограничение не применяется к вызовам концентратора потоковой передачи. |
DisableImplicitFromServicesParameters |
false |
Если это возможно, аргументы метода хаба будут разрешены из DI. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR при вызове Program.cs.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR, и могут быть настроены с помощью AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize, применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
CloseOnAuthenticationExpiration |
неправда | Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling.
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets свойства:
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder содержит параметры конфигурации построителя, а также сам HubConnection.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console пакет NuGet. Вызовите метод расширения AddConsole.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging метод. Укажите значение минимального уровня сообщений журнала LogLevel, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel можно указать также string значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLoggingминимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
| Струна | LogLevel |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None в методе configureLogging .
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging с клиентом Java SignalR.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите логирование в ваших зависимостях, SLF4J загружает логгер, не выполняющий никаких действий по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl (withUrl в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport поля в объекте параметров, предоставленном withUrl.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport на HttpHubConnectionBuilder. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider параметр (accessTokenFactory в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization с типом Bearer). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_tokenзапроса.
В клиенте .NET параметр AccessTokenProvider можно указать с помощью делегата параметров в WithUrl.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory поля в объекте параметров в withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления RxJavaSingle<String>. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection :
| Вариант | Значение по умолчанию | Описание |
|---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl (withUrl в JavaScript) на HubConnectionBuilder, либо с помощью различных API конфигурации на HttpHubConnectionBuilder в клиенте Java.
| Опция .NET | Значение по умолчанию | Описание |
|---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true, чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler, используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler.
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
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();
Дополнительные ресурсы
ASP.NET Core