Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматривается конфигурация ASP.NET Core SignalR.
Для получения руководств, которые дополняют или заменяют инструкции в этой статье, см. руководства ASP.NET CoreBlazorSignalR.BlazorSignalR
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol
можно добавить после AddSignalR в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см. раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. |
DisableImplicitFromServicesParameters |
false |
Если это возможно, аргументы метода концентратора разрешаются из DI. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
CloseOnAuthenticationExpiration |
неправда | Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel
можно указать также string
значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
Струна | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport
на HttpHubConnectionBuilder
. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и режима поддержания активного соединения.
Вариант | Значение по умолчанию | Описание |
---|---|---|
WithServerTimeout |
30 секунд (30 000 миллисекунд) | Тайм-аут для активности сервера устанавливается непосредственно на HubConnectionBuilder. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение должно быть числом, как минимум вдвое больше интервала поддержания соединения сервера (WithKeepAliveInterval ), чтобы обеспечить время для поступления пингов. |
HandshakeTimeout |
15 секунд | Время ожидания для начальной установки соединения с сервером и доступно на самом объекте HubConnection . Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
WithKeepAliveInterval |
15 секунд | Определяет интервал, с помощью которого клиент отправляет сообщения с связью и устанавливается непосредственно в HubConnectionBuilderней. Этот параметр позволяет серверу обнаруживать жесткие отключения, например, когда клиент отключает компьютер из сети. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
В следующем примере показаны значения, которые являются двойными значениями по умолчанию:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.WithServerTimeout(TimeSpan.FromSeconds(60))
.WithKeepAliveInterval(TimeSpan.FromSeconds(30))
.Build();
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
Настройка повторного подключения с отслеживанием состояния
SignalR Подключение с сохранением состояния уменьшает воспринимаемое время простоя клиентов, имеющих временное отключение в сетевом подключении, например, при переключении сетевых подключений или временной потере доступа.
Для достижения этого используется осознанное повторное подключение:
- Временное буферирование данных на сервере и клиенте.
- Подтверждение полученных сообщений (ACK-ing) как сервером, так и клиентом.
- Обнаружение восстановления подключения и повторная передача сообщений, которые могли быть отправлены во время его отсутствия.
Повторное подключение с отслеживанием состояния доступно в ASP.NET Core 8.0 и новее.
Войдите на повторное подключение с отслеживанием состояния как в конечной точке концентратора сервера, так и в клиенте:
Обновите конфигурацию конечной точки концентратора сервера, чтобы включить
AllowStatefulReconnects
параметр.app.MapHub<MyHub>("/hubName", options => { options.AllowStatefulReconnects = true; });
При необходимости максимальный размер буфера в байтах, разрешенных сервером, можно задать глобально или для определенного концентратора с параметром
StatefulReconnectBufferSize
:Глобальный
StatefulReconnectBufferSize
набор параметров:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
Набор
StatefulReconnectBufferSize
параметров для определенного концентратора:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
Этот
StatefulReconnectBufferSize
параметр является необязательным с значением по умолчанию 100 000 байт.Обновите клиентский
withStatefulReconnect
код JavaScript или TypeScript, чтобы включить этот параметр:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();
Этот
bufferSize
параметр является необязательным с значением по умолчанию 100 000 байт.Обновите код .NET клиента, чтобы включить параметр
WithStatefulReconnect
.var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();
Этот
StatefulReconnectBufferSize
параметр является необязательным с значением по умолчанию 100 000 байт.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, используемую как токен аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите это значение на true , чтобы пропустить шаг согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть конфигурирована на сервере с помощью метода расширения AddJsonProtocol, который можно добавить после AddSignalR в вашем методе Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings
, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.
Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код в Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую следует изменить только в случае возникновения ошибок времени ожидания рукопожатия из-за серьезной задержки сети. Для получения более подробной информации о процессе рукопожатия см. SignalR спецификацию протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу получать более крупные сообщения, но может негативно повлиять на потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправляемых приложением и буферизуемых сервером. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval , чтобы обеспечить время для прибытия эхо-запросов. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть конфигурирована на сервере с помощью метода расширения AddJsonProtocol, который можно добавить после AddSignalR в вашем методе Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings
, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.
Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код в Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу получать более крупные сообщения, но может негативно повлиять на потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправляемых приложением и буферизуемых сервером. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания активности сервера истекло. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим, чтобы сообщение ping было отправлено с сервера и получено клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, как минимум вдвое превышающее значение сервера KeepAliveInterval , чтобы обеспечить прибытие ping-запросов вовремя. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol
можно добавить после AddSignalR в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см. раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel
можно указать также string
значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
Струна | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport
на HttpHubConnectionBuilder
. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval , чтобы обеспечить время для прибытия эхо-запросов. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol
можно добавить после AddSignalR в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см. раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, без ожидания обратного давления, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel
можно указать также string
значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
Струна | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport
на HttpHubConnectionBuilder
. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval , чтобы обеспечить время для прибытия эхо-запросов. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol
можно добавить после AddSignalR в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Startup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см. раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу быстрее принимать более крупные сообщения без применения противодавления, но при этом может увеличиться потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, без ожидания обратного давления, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel
можно указать также string
значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
Струна | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport
на HttpHubConnectionBuilder
. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval , чтобы обеспечить время для прибытия эхо-запросов. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol
можно добавить после AddSignalR в Program.cs
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см. раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
CloseOnAuthenticationExpiration |
неправда | Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel
можно указать также string
значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
Струна | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport
на HttpHubConnectionBuilder
. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval , чтобы обеспечить время для прибытия эхо-запросов. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
На сервере можно настроить сериализацию JSON с помощью метода расширения AddJsonProtocol.
AddJsonProtocol
можно добавить после AddSignalR в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает объект options
. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор так, чтобы не изменять регистр имен свойств, вместо использования имен в стиле camelCase по умолчанию, используйте следующий код в Program.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же метод расширения AddJsonProtocol
существует на HubConnectionBuilder. Необходимо импортировать пространство имен Microsoft.Extensions.DependencyInjection
, чтобы разрешить метод расширения.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Замечание
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключитесь на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см. раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Настроить сериализацию MessagePack можно, предоставив делегат вызову AddMessagePackProtocol. Дополнительные сведения см. в SignalRразделе MessagePack.
Замечание
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны опции настройки SignalR хабов.
Вариант | Значение по умолчанию | Описание |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени, чем предусмотрено таймаутом, для того чтобы клиент был помечен как отключенный, из-за особенностей реализации. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет первоначальное сообщение рукопожатия в течение этого интервала времени, подключение закрывается. Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, ping-сообщение отправляется автоматически для поддержания подключения. При изменении KeepAliveInterval необходимо изменить параметр ServerTimeout или serverTimeoutInMilliseconds на клиенте. Рекомендуемое значение ServerTimeout или serverTimeoutInMilliseconds вдвое больше значения KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе концентратора. По умолчанию это false , поскольку эти сообщения исключений могут содержать конфиденциальную информацию. |
StreamBufferCapacity |
10 |
Максимальное количество объектов, которые можно буферизировать для клиентских потоков загрузки. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения узла. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов хаба, которые каждый клиент может вызывать параллельно до постановки в очередь. |
DisableImplicitFromServicesParameters |
false |
Если это возможно, аргументы метода хаба будут разрешены из DI. |
Параметры можно настроить для всех центров, предоставив делегат параметров AddSignalR
при вызове Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного узла переопределяют глобальные параметры, предоставляемые в AddSignalR
, и могут быть настроены с помощью AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которые сервер буферизует перед применением противодавления. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не создавая обратного давления, хотя может привести к увеличению потребления памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое сервер буферизирует до возникновения обратного давления. Увеличение этого значения позволяет серверу буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов Authorize , применяемых к классу Hub. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, специфичные для транспорта Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это используется для ограничения использования клиентами более новых версий. |
CloseOnAuthenticationExpiration |
неправда | Установите этот параметр, чтобы включить отслеживание истечения срока действия аутентификации, которое закроет подключения при истечении срока действия токена. |
Дополнительные параметры транспорта Long Polling могут быть настроены с использованием свойства LongPolling
.
Вариант | Значение по умолчанию | Описание |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Описание |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не завершает соединение в течение этого интервала времени, подключение прерывается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для установки пользовательского значения заголовка Sec-WebSocket-Protocol . Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но подкласс HttpHubConnectionBuilder
содержит параметры конфигурации построителя, а также сам HubConnection
.
Настройка логирования
Логирование настраивается в клиенте .NET с помощью метода ConfigureLogging
. Поставщики и фильтры журналирования могут быть зарегистрированы так же, как на сервере. Дополнительные сведения см. в документации по ведению журналов в ASP.NET Core.
Замечание
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. С полным списком можно ознакомиться в разделе документации «Встроенные поставщики ведения журнала».
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. Вызовите метод расширения AddConsole
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение минимального уровня сообщений журнала LogLevel
, который требуется. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Вместо значения LogLevel
можно указать также string
значение, представляющее уровень журналирования. Это полезно при настройке SignalR ведения журнала в средах, где отсутствует доступ к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень логирования, который будет зафиксирован. Сообщения, зарегистрированные на этом уровне , или уровни, перечисленные после него в таблице, будут записаны в журнал.
Струна | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
илиinformation |
LogLevel.Information |
warn
илиwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Замечание
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые SignalR, можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ-операция значения HttpTransportType
может быть использована для ограничения клиента в использовании только указанных средств передачи данных. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий Server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается методом withTransport
на HttpHubConnectionBuilder
. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Замечание
Клиент SignalR Java пока не поддерживает резервный механизм передачи.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот токен доступа передается как HTTP токен "Bearer Authentication" (используя заголовок Authorization
с типом Bearer
). В клиенте JavaScript токен доступа используется как Bearer token, за исключением нескольких случаев, когда API браузера ограничивают возможность применения заголовков (в частности, в запросах Server-Sent Events и WebSockets). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте .NET параметр AccessTokenProvider
можно указать с помощью делегата параметров в WithUrl
.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте . При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройте параметры времени ожидания и режим поддержания соединения
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Описание |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания серверной активности. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для того, чтобы пинг-сообщение могло быть отправлено с сервера и получено клиентом в течение интервала ожидания. Рекомендуемое значение — это число, как минимум вдвое больше значения сервера KeepAliveInterval , чтобы обеспечить время для прибытия эхо-запросов. |
HandshakeTimeout |
15 секунд | Время ожидания для начального рукопожатия с сервером. Если сервер не отправляет ответ рукопожатия в этот интервал, клиент отменяет рукопожатие и вызывает событие Closed (onclose в JavaScript). Это расширенная настройка, которую надо изменить только в случае, если происходят проблемы с тайм-аутами во время рукопожатия из-за серьезной задержки сети. Дополнительные сведения о процессе рукопожатия см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с какой частотой клиент отправляет ping-сообщения. Отправка любого сообщения с клиента приводит к сбросу таймера в начало интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) на HubConnectionBuilder
, либо с помощью различных API конфигурации на HttpHubConnectionBuilder
в клиенте Java.
Опция .NET | Значение по умолчанию | Описание |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, которая используется в качестве токена аутентификации Bearer в HTTP-запросах. |
SkipNegotiation |
false |
Установите true для пропуска шага согласования.
Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Пусто | Коллекция сертификатов TLS для отправки с целю проверки подлинности запросов. |
Cookies |
Пусто | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Пусто | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Пусто | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены HttpMessageHandler , используемого для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Либо измените параметры этого значения по умолчанию и верните его, либо верните новый экземпляр HttpMessageHandler .
При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Установите это логическое значение для отправки учетных данных по умолчанию в запросах HTTP и WebSockets. Это позволяет использовать проверку подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое клиент буферизует перед применением обратного давления. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения без снижения скорости передачи, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением обратного давления. Увеличение этого значения позволяет клиенту буферизовать более крупные сообщения быстрее, не ожидая обратного давления, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
ASP.NET Core