Конфигурация SignalR ASP.NET Core
В этой статье рассматриваются ASP.NET конфигурации Core SignalR .
Инструкции, которые добавляются в инструкции или заменяются инструкциями в этой статье, см. в ASP.NET основных BlazorSignalR руководствах.BlazorSignalR
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере AddJsonProtocol с помощью метода расширения. AddJsonProtocol
можно добавить после AddSignalR этого в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код вProgram.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключение на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см . раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
StreamBufferCapacity |
10 |
Максимальное количество элементов, которые можно буферигрировать для потоков отправки клиента. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов концентратора, которое каждый клиент может вызывать параллельно перед очередью. |
DisableImplicitFromServicesParameters |
false |
Если это возможно, аргументы метода концентратора разрешаются из DI. |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которое буферы сервера перед применением обратной прессы. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не применяя обратную прессу, но может увеличить потребление памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое буферизирует сервер перед наблюдением обратной прессы. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это позволяет ограничить клиенты более новыми версиями. |
CloseOnAuthenticationExpiration |
false | Установите этот параметр, чтобы включить отслеживание срока действия проверки подлинности, которое закроет подключения при истечении срока действия маркера. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
Вместо значения можно также указать string
значение, представляющее имя уровня журнала. Это полезно при настройке SignalR ведения журнала в средах, где у вас нет доступа к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень журнала, который будет зарегистрирован. Сообщения, зарегистрированные на этом уровне, или уровни, перечисленные после него в таблице, будут записаны в журнал.
Строка | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info или information |
LogLevel.Information |
warn или warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с withTransport
помощью метода в клиенте HttpHubConnectionBuilder
Java. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Примечание.
Клиент SignalR Java пока не поддерживает резервную передачу транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности:
Вариант | Значение по умолчанию | Description |
---|---|---|
WithServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера и устанавливается непосредственно в HubConnectionBuilder. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, двойное значение интервалаWithKeepAliveInterval () сервера, чтобы разрешить время поступления ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения исходного HubConnection сервера и доступно для самого объекта. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
WithKeepAliveInterval |
15 секунд | Определяет интервал, с помощью которого клиент отправляет сообщения с связью и устанавливается непосредственно в HubConnectionBuilderней. Этот параметр позволяет серверу обнаруживать жесткие отключения, например, когда клиент отключает компьютер из сети. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
В следующем примере показаны значения, которые являются двойными значениями по умолчанию:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.WithServerTimeout(TimeSpan.FromSeconds(60))
.WithKeepAliveInterval(TimeSpan.FromSeconds(30))
.Build();
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
Настройка повторного подключения с отслеживанием состояния
SignalR Повторное подключение с отслеживанием состояния уменьшает предполагаемое время простоя клиентов, имеющих временное отключение в сетевом подключении, например при переключении сетевых подключений или временной потере доступа.
Повторное подключение с отслеживанием состояния достигается следующим образом:
- Временно буферизация данных на сервере и клиенте.
- Подтверждение полученных сообщений (ACK-ing) как сервером, так и клиентом.
- Распознавая, когда подключение выполняется и выполняется повторная отправка сообщений, которые могли быть отправлены во время отключения подключения.
Повторное подключение с отслеживанием состояния доступно в ASP.NET Core 8.0 и более поздних версий.
Войдите на повторное подключение с отслеживанием состояния как в конечной точке концентратора сервера, так и в клиенте:
Обновите конфигурацию конечной точки концентратора сервера, чтобы включить
AllowStatefulReconnects
этот параметр:app.MapHub<MyHub>("/hubName", options => { options.AllowStatefulReconnects = true; });
При необходимости максимальный размер буфера в байтах, разрешенных сервером, можно задать глобально или для определенного концентратора с параметром
StatefulReconnectBufferSize
:Глобальный
StatefulReconnectBufferSize
набор параметров:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
Набор
StatefulReconnectBufferSize
параметров для определенного концентратора:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
Этот
StatefulReconnectBufferSize
параметр является необязательным с значением по умолчанию 100 000 байт.Обновите клиентский
withStatefulReconnect
код JavaScript или TypeScript, чтобы включить этот параметр:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();
Этот
bufferSize
параметр является необязательным с значением по умолчанию 100 000 байт.Обновите клиентский
WithStatefulReconnect
код .NET, чтобы включить этот параметр:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();
Этот
StatefulReconnectBufferSize
параметр является необязательным с значением по умолчанию 100 000 байт.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое буферы клиента перед применением обратной прессы. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения, не применяя обратную прессу, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением за обратным выражением. Увеличение этого значения позволяет клиенту буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере с помощью AddJsonProtocol метода расширения, который можно добавить после AddSignalR выполнения Startup.ConfigureServices
метода. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings
, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.
Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код вStartup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу принимать сообщения большего размера, однако это может негативно сказаться на потреблении памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправляемых приложением, буферизацией сервера. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере с помощью AddJsonProtocol метода расширения, который можно добавить после AddSignalR выполнения Startup.ConfigureServices
метода. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerSettings этого объекта является объектом Json.NET JsonSerializerSettings
, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации по Json.NET.
Например, чтобы настроить сериализатор для использования имен свойств PascalCase, а не имен вариантов верблюжих по умолчанию, используйте следующий код вStartup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR((configure) =>
{
var desiredTransports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
configure.MapHub<ChatHub>("/chathub", (options) =>
{
options.Transports = desiredTransports;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферизирует сервер. Увеличение этого значения позволяет серверу принимать сообщения большего размера, однако это может негативно сказаться на потреблении памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправляемых приложением, буферизацией сервера. Увеличение этого значения позволяет серверу отправлять более крупные сообщения, но может негативно повлиять на потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с которым клиент отправляет сообщения с связью. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере AddJsonProtocol с помощью метода расширения. AddJsonProtocol
можно добавить после AddSignalR этого в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код вStartup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключение на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см . раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
StreamBufferCapacity |
10 |
Максимальное количество элементов, которые можно буферигрировать для потоков отправки клиента. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферы сервера перед применением обратной прессы. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не применяя обратную прессу, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое буферизирует сервер перед наблюдением обратной прессы. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
Вместо значения можно также указать string
значение, представляющее имя уровня журнала. Это полезно при настройке SignalR ведения журнала в средах, где у вас нет доступа к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень журнала, который будет зарегистрирован. Сообщения, зарегистрированные на этом уровне, или уровни, перечисленные после него в таблице, будут записаны в журнал.
Строка | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info или information |
LogLevel.Information |
warn или warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с withTransport
помощью метода в клиенте HttpHubConnectionBuilder
Java. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Примечание.
Клиент SignalR Java пока не поддерживает резервную передачу транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с которым клиент отправляет сообщения с связью. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере AddJsonProtocol с помощью метода расширения. AddJsonProtocol
можно добавить после AddSignalR этого в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код вStartup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключение на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см . раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
StreamBufferCapacity |
10 |
Максимальное количество элементов, которые можно буферигрировать для потоков отправки клиента. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферы сервера перед применением обратной прессы. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не применяя обратную прессу, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое буферизирует сервер перед наблюдением обратной прессы. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это позволяет ограничить клиенты более новыми версиями. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
Вместо значения можно также указать string
значение, представляющее имя уровня журнала. Это полезно при настройке SignalR ведения журнала в средах, где у вас нет доступа к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень журнала, который будет зарегистрирован. Сообщения, зарегистрированные на этом уровне, или уровни, перечисленные после него в таблице, будут записаны в журнал.
Строка | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info или information |
LogLevel.Information |
warn или warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с withTransport
помощью метода в клиенте HttpHubConnectionBuilder
Java. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Примечание.
Клиент SignalR Java пока не поддерживает резервную передачу транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с которым клиент отправляет сообщения с связью. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере AddJsonProtocol с помощью метода расширения. AddJsonProtocol
можно добавить после AddSignalR этого в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код вStartup.ConfigureServices
:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключение на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см . раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
StreamBufferCapacity |
10 |
Максимальное количество элементов, которые можно буферигрировать для потоков отправки клиента. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов концентратора, которое каждый клиент может вызывать параллельно перед очередью. |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Startup.ConfigureServices
.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Startup.Configure
.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
32 КБ | Максимальное количество байтов, полученных от клиента, которое буферы сервера перед применением обратной прессы. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не применяя обратную прессу, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
TransportMaxBufferSize |
32 КБ | Максимальное количество байтов, отправленных приложением, которое буферизирует сервер перед наблюдением обратной прессы. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это позволяет ограничить клиенты более новыми версиями. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
Вместо значения можно также указать string
значение, представляющее имя уровня журнала. Это полезно при настройке SignalR ведения журнала в средах, где у вас нет доступа к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень журнала, который будет зарегистрирован. Сообщения, зарегистрированные на этом уровне, или уровни, перечисленные после него в таблице, будут записаны в журнал.
Строка | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info или information |
LogLevel.Information |
warn или warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с withTransport
помощью метода в клиенте HttpHubConnectionBuilder
Java. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Примечание.
Клиент SignalR Java пока не поддерживает резервную передачу транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с которым клиент отправляет сообщения с связью. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере AddJsonProtocol с помощью метода расширения. AddJsonProtocol
можно добавить после AddSignalR этого в Program.cs
. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код вProgram.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключение на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см . раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
StreamBufferCapacity |
10 |
Максимальное количество элементов, которые можно буферигрировать для потоков отправки клиента. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов концентратора, которое каждый клиент может вызывать параллельно перед очередью. |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которое буферы сервера перед применением обратной прессы. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не применяя обратную прессу, но может увеличить потребление памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое буферизирует сервер перед наблюдением обратной прессы. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это позволяет ограничить клиенты более новыми версиями. |
CloseOnAuthenticationExpiration |
false | Установите этот параметр, чтобы включить отслеживание срока действия проверки подлинности, которое закроет подключения при истечении срока действия маркера. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
Вместо значения можно также указать string
значение, представляющее имя уровня журнала. Это полезно при настройке SignalR ведения журнала в средах, где у вас нет доступа к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень журнала, который будет зарегистрирован. Сообщения, зарегистрированные на этом уровне, или уровни, перечисленные после него в таблице, будут записаны в журнал.
Строка | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info или information |
LogLevel.Information |
warn или warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с withTransport
помощью метода в клиенте HttpHubConnectionBuilder
Java. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Примечание.
Клиент SignalR Java пока не поддерживает резервную передачу транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с которым клиент отправляет сообщения с связью. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое буферы клиента перед применением обратной прессы. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения, не применяя обратную прессу, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением за обратным выражением. Увеличение этого значения позволяет клиенту буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
Параметры сериализации JSON/MessagePack
ASP.NET Core SignalR поддерживает два протокола для кодирования сообщений: JSON и MessagePack. Каждый протокол имеет параметры конфигурации сериализации.
Сериализация JSON может быть настроена на сервере AddJsonProtocol с помощью метода расширения. AddJsonProtocol
можно добавить после AddSignalR этого в Startup.ConfigureServices
. Метод AddJsonProtocol
принимает делегат, который получает options
объект. Свойство PayloadSerializerOptions этого объекта — это System.Text.Json
JsonSerializerOptions объект, который можно использовать для настройки сериализации аргументов и возвращаемых значений. Дополнительные сведения см. в документации System.Text.Json.
Например, чтобы настроить сериализатор, чтобы не изменять регистр имен свойств, а не имена вариантов верблюжего типа по умолчанию, используйте следующий код вProgram.cs
:
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
В клиенте .NET тот же AddJsonProtocol
метод расширения существует в HubConnectionBuilder. Для Microsoft.Extensions.DependencyInjection
разрешения метода расширения необходимо импортировать пространство имен:
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
Примечание.
В настоящее время невозможно настроить сериализацию JSON в клиенте JavaScript.
Переключение на Newtonsoft.Json
Если вам нужны функции Newtonsoft.Json
, которые не поддерживаются System.Text.Json
, см . раздел "Переключиться на Newtonsoft.Json
".
Параметры сериализации MessagePack
Сериализация MessagePack может быть настроена, предоставив делегат вызову AddMessagePackProtocol . Дополнительные сведения см . в SignalR разделе MessagePack.
Примечание.
В настоящее время невозможно настроить сериализацию MessagePack в клиенте JavaScript.
Настройка параметров сервера
В следующей таблице описаны параметры настройки SignalR центров:
Вариант | Значение по умолчанию | Description |
---|---|---|
ClientTimeoutInterval |
30 секунд | Сервер считает, что клиент отключен, если он не получил сообщение (включая сохранение активности) в этом интервале. Это может занять больше времени ожидания, чем для того, чтобы клиент был помечен как отключен из-за того, как это реализуется. Рекомендуемое значение равно двойному значению KeepAliveInterval . |
HandshakeTimeout |
15 секунд | Если клиент не отправляет исходное сообщение подтверждения в течение этого интервала времени, подключение закрывается. Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Если сервер не отправил сообщение в течение этого интервала, сообщение связи отправляется автоматически, чтобы сохранить подключение открытым. При изменении KeepAliveInterval , измените ServerTimeout или serverTimeoutInMilliseconds настроите параметр на клиенте. Рекомендуемое ServerTimeout значение или serverTimeoutInMilliseconds значение является двойным KeepAliveInterval . |
SupportedProtocols |
Все установленные протоколы | Протоколы, поддерживаемые этим центром. По умолчанию разрешены все протоколы, зарегистрированные на сервере. Протоколы можно удалить из этого списка, чтобы отключить определенные протоколы для отдельных центров. |
EnableDetailedErrors |
false |
Если true подробные сообщения об исключениях возвращаются клиентам при возникновении исключения в методе Концентратора. По умолчанию эти сообщения исключений могут содержать конфиденциальную false информацию. |
StreamBufferCapacity |
10 |
Максимальное количество элементов, которые можно буферигрировать для потоков отправки клиента. Если это ограничение достигнуто, обработка вызовов блокируется до тех пор, пока сервер не обрабатывает элементы потока. |
MaximumReceiveMessageSize |
32 КБ | Максимальный размер одного входящего сообщения концентратора. Увеличение значения может увеличить риск атак типа "отказ в обслуживании" (DoS). |
MaximumParallelInvocationsPerClient |
1 | Максимальное количество методов концентратора, которое каждый клиент может вызывать параллельно перед очередью. |
DisableImplicitFromServicesParameters |
false |
Если это возможно, аргументы метода концентратора будут разрешены из DI. |
Параметры можно настроить для всех центров, предоставив делегат AddSignalR
параметров для вызова Program.cs
.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
Параметры для одного концентратора переопределяют глобальные параметры, предоставляемые и AddSignalR
можно настроить с помощью AddHubOptions:
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Дополнительные параметры конфигурации HTTP
Используйте HttpConnectionDispatcherOptions
для настройки расширенных параметров, связанных с транспортировкой и управлением буфером памяти. Эти параметры настраиваются путем передачи делегата MapHub в Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
В следующей таблице описаны параметры настройки расширенных параметров HTTP ASP.NET Core SignalR:
Вариант | Значение по умолчанию | Description |
---|---|---|
ApplicationMaxBufferSize |
64 КБ | Максимальное количество байтов, полученных от клиента, которое буферы сервера перед применением обратной прессы. Увеличение этого значения позволяет серверу получать более крупные сообщения быстрее, не применяя обратную прессу, но может увеличить потребление памяти. |
TransportMaxBufferSize |
64 КБ | Максимальное количество байтов, отправленных приложением, которое буферизирует сервер перед наблюдением обратной прессы. Увеличение этого значения позволяет серверу буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
AuthorizationData |
Данные автоматически собираются из атрибутов, Authorize примененных к классу Концентратора. |
Список объектов, используемых IAuthorizeData для определения того, авторизован ли клиент для подключения к центру. |
Transports |
Все транспорты включены. | Битовые флаги перечисления значений HttpTransportType , которые могут ограничить транспорты, которые клиент может использовать для подключения. |
LongPolling |
См. ниже. | Дополнительные параметры, относящиеся к транспорту Long Polling. |
WebSockets |
См. ниже. | Дополнительные параметры, относящиеся к транспорту WebSockets. |
MinimumProtocolVersion |
0 | Укажите минимальную версию протокола согласования. Это позволяет ограничить клиенты более новыми версиями. |
CloseOnAuthenticationExpiration |
false | Установите этот параметр, чтобы включить отслеживание срока действия проверки подлинности, которое закроет подключения при истечении срока действия маркера. |
Транспорт Long Polling имеет дополнительные параметры, которые можно настроить с помощью LongPolling
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
PollTimeout |
90 секунд | Максимальное время, когда сервер ожидает отправки сообщения клиенту перед завершением одного запроса опроса. Уменьшение этого значения приводит к тому, что клиент часто выдает новые запросы опроса. |
Транспорт WebSocket имеет дополнительные параметры, которые можно настроить с помощью WebSockets
свойства:
Вариант | Значение по умолчанию | Description |
---|---|---|
CloseTimeout |
5 секунд | После закрытия сервера, если клиент не удается закрыть в течение этого интервала времени, подключение завершается. |
SubProtocolSelector |
null |
Делегат, который можно использовать для задания заголовка Sec-WebSocket-Protocol настраиваемого значения. Делегат получает значения, запрошенные клиентом в качестве входных данных, и, как ожидается, возвращает требуемое значение. |
Настройка параметров клиента
Параметры клиента можно настроить для HubConnectionBuilder
типа (доступные в клиентах .NET и JavaScript). Он также доступен в клиенте Java, но HttpHubConnectionBuilder
подкласс содержит параметры конфигурации построителя, а также сам по HubConnection
себе.
Настройка журнала
Ведение журнала настраивается в клиенте ConfigureLogging
.NET с помощью метода. Поставщики и фильтры ведения журнала могут быть зарегистрированы так же, как и на сервере. Дополнительные сведения см. в документации по ASP.NET Core .
Примечание.
Чтобы зарегистрировать поставщиков ведения журнала, необходимо установить необходимые пакеты. Полный список см. в разделе "Встроенные поставщики ведения журнала".
Например, чтобы включить ведение журнала консоли, установите Microsoft.Extensions.Logging.Console
пакет NuGet. AddConsole
Вызовите метод расширения:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
В клиенте JavaScript существует аналогичный configureLogging
метод. Укажите значение, указывающее минимальный LogLevel
уровень сообщений журнала для создания. Журналы записываются в окно консоли браузера.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
Вместо значения можно также указать string
значение, представляющее имя уровня журнала. Это полезно при настройке SignalR ведения журнала в средах, где у вас нет доступа к LogLevel
константам.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
В следующей таблице перечислены доступные уровни журнала. Указанное значение задает configureLogging
минимальный уровень журнала, который будет зарегистрирован. Сообщения, зарегистрированные на этом уровне, или уровни, перечисленные после него в таблице, будут записаны в журнал.
Строка | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info или information |
LogLevel.Information |
warn или warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Примечание.
Чтобы полностью отключить ведение журнала, укажите signalR.LogLevel.None
в методе configureLogging
.
Дополнительные сведения о ведении журнала см. в документации по диагностикеSignalR.
Клиент SignalR Java использует библиотеку SLF4J для ведения журнала. Это высокоуровневый API ведения журнала, позволяющий пользователям библиотеки выбрать собственную реализацию ведения журнала, введя определенную зависимость ведения журнала. В следующем фрагменте кода показано, как использовать java.util.logging
его с клиентом SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Если вы не настроите ведение журнала в зависимостях, SLF4J загружает средство ведения журнала без операций по умолчанию со следующим предупреждением:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Это предупреждение можно игнорировать.
Настройка разрешенных транспортов
Транспорты, используемые в SignalR вызове , можно настроить в вызове WithUrl
(withUrl
в JavaScript). Побитовое ИЛИ значения HttpTransportType
можно использовать для ограничения клиента только указанных транспортных средств. Все транспорты включены по умолчанию.
Например, чтобы отключить транспорт событий server-Sent, но разрешить подключения WebSockets и Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
В клиенте JavaScript транспорты настраиваются путем задания transport
поля в объекте параметров, предоставленном withUrl
в следующих значениях:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
В этой версии клиента Java WebSockets является единственным доступным транспортом.
В клиенте Java транспорт выбирается с withTransport
помощью метода в клиенте HttpHubConnectionBuilder
Java. Клиент Java по умолчанию использует транспорт WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Примечание.
Клиент SignalR Java пока не поддерживает резервную передачу транспорта.
Настройка проверки подлинности носителя
Чтобы предоставить данные проверки подлинности вместе с SignalR запросами, используйте AccessTokenProvider
параметр (accessTokenFactory
в JavaScript), чтобы указать функцию, которая возвращает требуемый маркер доступа. В клиенте .NET этот маркер доступа передается в виде маркера HTTP "Проверка подлинности носителя" (использование Authorization
заголовка с типом Bearer
). В клиенте JavaScript маркер доступа используется в качестве маркера носителя, за исключением нескольких случаев, когда API-интерфейсы браузера ограничивают возможность применения заголовков (в частности, в запросах событий и webSockets сервера). В таких случаях маркер доступа предоставляется как строковое значение access_token
запроса.
В клиенте AccessTokenProvider
.NET можно указать параметр с помощью делегата параметров в WithUrl
:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
В клиенте JavaScript маркер доступа настраивается путем задания accessTokenFactory
поля в объекте параметров в withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
accessTokenFactory: () => {
// Get and return the access token.
// This function can return a JavaScript Promise if asynchronous
// logic is required to retrieve the access token.
}
})
.build();
В клиенте SignalR Java можно настроить маркер носителя для проверки подлинности, предоставив фабрику маркеров доступа HttpHubConnectionBuilder. Используйте withAccessTokenFactory для предоставления одной строки> RxJava<. При вызове Single.defer можно написать логику для создания маркеров доступа для клиента.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Настройка параметров времени ожидания и поддержания активности
Дополнительные параметры настройки времени ожидания и поддержания активности доступны в самом объекте HubConnection
:
Вариант | Значение по умолчанию | Description |
---|---|---|
ServerTimeout |
30 секунд (30 000 миллисекунд) | Время ожидания для действия сервера. Если сервер не отправил сообщение в этом интервале, клиент считает сервер отключенным и активирует Closed событие (onclose в JavaScript). Это значение должно быть достаточно большим для отправки сообщения связи с сервером и получения клиентом в течение интервала времени ожидания. Рекомендуемое значение — это число, по крайней мере, удвоенное значение сервера KeepAliveInterval , чтобы разрешить время прибытия ping. |
HandshakeTimeout |
15 секунд | Время ожидания для подтверждения начального сервера. Если сервер не отправляет ответ подтверждения в этом интервале, клиент отменяет подтверждение и активирует Closed событие (onclose в JavaScript). Это дополнительный параметр, который следует изменить только в случае возникновения ошибок времени ожидания подтверждения из-за серьезной задержки сети. Дополнительные сведения о процессе подтверждения см. в SignalR спецификации протокола Концентратора. |
KeepAliveInterval |
15 секунд | Определяет интервал, с которым клиент отправляет сообщения с связью. Отправка любого сообщения от клиента сбрасывает таймер до начала интервала. Если клиент не отправил сообщение в наборе ClientTimeoutInterval на сервере, сервер считает, что клиент отключен. |
В клиенте .NET значения времени ожидания указываются в качестве TimeSpan
значений.
Настройка дополнительных параметров
Дополнительные параметры можно настроить в методе WithUrl
(withUrl
в JavaScript) в HubConnectionBuilder
различных API HttpHubConnectionBuilder
конфигурации на клиенте Java:
Параметр .NET | Значение по умолчанию | Description |
---|---|---|
AccessTokenProvider |
null |
Функция, возвращающая строку, предоставляемую в качестве маркера проверки подлинности носителя в HTTP-запросах. |
SkipNegotiation |
false |
Установите для этого значение, чтобы true пропустить шаг согласования. Поддерживается только в том случае, если транспорт WebSockets является единственным включенным транспортом. Этот параметр нельзя включить при использовании службы Azure SignalR . |
ClientCertificates |
Нет значения | Коллекция сертификатов TLS для отправки в запросы проверки подлинности. |
Cookies |
Нет значения | Коллекция файлов cookie HTTP для отправки с каждым HTTP-запросом. |
Credentials |
Нет значения | Учетные данные для отправки с каждым HTTP-запросом. |
CloseTimeout |
5 секунд | Только WebSockets. Максимальное время, которое клиент ожидает после закрытия сервера, чтобы подтвердить закрытие запроса. Если сервер не подтверждает закрытие в течение этого времени, клиент отключается. |
Headers |
Нет значения | Карта дополнительных заголовков HTTP для отправки с каждым HTTP-запросом. |
HttpMessageHandlerFactory |
null |
Делегат, который можно использовать для настройки или замены используемых HttpMessageHandler для отправки HTTP-запросов. Не используется для подключений WebSocket. Этот делегат должен возвращать значение, отличное от NULL, и получает значение по умолчанию в качестве параметра. Измените параметры для этого значения по умолчанию и верните его или верните новый HttpMessageHandler экземпляр. При замене обработчика обязательно скопируйте параметры, которые вы хотите сохранить с предоставленного обработчика, в противном случае настроенные параметры (например, файлы cookie и заголовки) не будут применяться к новому обработчику. |
Proxy |
null |
Прокси-сервер HTTP, используемый при отправке HTTP-запросов. |
UseDefaultCredentials |
false |
Задайте для этого логическое значение, чтобы отправить учетные данные по умолчанию для запросов HTTP и WebSockets. Это позволяет использовать проверка подлинности Windows. |
WebSocketConfiguration |
null |
Делегат, который можно использовать для настройки дополнительных параметров WebSocket. Получает экземпляр ClientWebSocketOptions , который можно использовать для настройки параметров. |
ApplicationMaxBufferSize |
1 МБ | Максимальное количество байтов, полученных от сервера, которое буферы клиента перед применением обратной прессы. Увеличение этого значения позволяет клиенту быстрее получать более крупные сообщения, не применяя обратную прессу, но может увеличить потребление памяти. |
TransportMaxBufferSize |
1 МБ | Максимальное количество байтов, отправленных пользовательским приложением, которое буферизирует клиент перед наблюдением за обратным выражением. Увеличение этого значения позволяет клиенту буферизуть более крупные сообщения быстрее, не ожидая обратных выражений, но может увеличить потребление памяти. |
В клиенте .NET эти параметры можно изменить делегатом параметров, предоставленным WithUrl
следующим образом:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.SkipNegotiation = true;
options.Transports = HttpTransportType.WebSockets;
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
В клиенте JavaScript эти параметры можно указать в объекте JavaScript, предоставленном withUrl
следующим образом:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
// "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
headers: { "Foo": "Bar" },
transport: signalR.HttpTransportType.LongPolling
})
.build();
В клиенте Java эти параметры можно настроить с помощью методов, HttpHubConnectionBuilder
возвращаемых из HubConnectionBuilder.create("HUB URL")
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Дополнительные ресурсы
ASP.NET Core