Использование Служба Azure SignalR
В этой статье показано, как использовать пакет SDK на стороне сервера приложений для подключения к Служба SignalR при использовании SignalR на сервере приложений.
Внимание
Необработанные строка подключения отображаются в этой статье только для демонстрационных целей.
Строка подключения включает сведения о авторизации, необходимые для доступа к Служба Azure SignalR приложения. Ключ доступа в строке подключения аналогичен паролю привилегированного пользователя для службы. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты строка подключения с помощью идентификатора Microsoft Entra и авторизации доступа с помощью идентификатора Microsoft Entra.
Старайтесь не распространять ключи доступа среди других пользователей, жестко программировать их или где-то сохранять в виде обычного текста в открытом доступе для других пользователей. Меняйте свои ключи постоянно, если предполагаете, что они могут быть подобраны.
Создание экземпляра службы Azure SignalR
Для ASP.NET Core SignalR
Установка пакета SDK
Выполните команду, чтобы установить пакет SDK Служба SignalR в проект ASP.NET Core.
dotnet add package Microsoft.Azure.SignalR
Startup
В классе используйте пакет SDK Служба SignalR в качестве следующего фрагмента кода.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR()
.AddAzureSignalR();
}
public void Configure(IApplicationBuilder app)
{
app.UseEndpoints(routes =>
{
routes.MapHub<YourHubClass>("/path_for_your_hub");
});
}
Настройка строки подключения
Необработанные строка подключения отображаются в этой статье только для демонстрационных целей. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты строка подключения с помощью идентификатора Microsoft Entra и авторизации доступа с помощью идентификатора Microsoft Entra.
Существует два подхода к настройке строка подключения Служба SignalR в приложении.
Задайте переменную среды с именем
Azure:SignalR:ConnectionString
илиAzure__SignalR__ConnectionString
.- В службе приложение Azure поместите его в параметры приложения.
Передайте строка подключения в качестве параметра
AddAzureSignalR()
.services.AddSignalR() .AddAzureSignalR("<replace with your connection string>");
or
services.AddSignalR() .AddAzureSignalR(options => options.ConnectionString = "<replace with your connection string>");
Настройка параметров
При использовании пакета SDK для Служба Azure SignalR можно настроить несколько вариантов.
ConnectionString
- Значение по умолчанию — это
Azure:SignalR:ConnectionString
connectionString
appSetting
или вweb.config
файле. - Его можно перенастроить, но убедитесь, что значение не закодировано.
InitialHubServerConnectionCount
- Значение по умолчанию:
5
. - Этот параметр определяет начальное количество подключений на концентратор между сервером приложений и Служба Azure SignalR. Обычно держите его достаточно, так как значение по умолчанию достаточно. Во время выполнения пакет SDK может запускать новые подключения к серверу для настройки производительности или балансировки нагрузки. При наличии большого количества клиентов вы можете дать ему большее число для повышения пропускной способности. Например, если у вас есть 100 000 клиентов в общей сложности, число подключений может быть увеличено до
10
или15
.
MaxHubServerConnectionCount
- Значение по умолчанию:
null
. - Этот параметр определяет максимальное количество подключений, разрешенных для каждого концентратора между сервером приложений и Служба Azure SignalR. Во время выполнения пакет SDK может запускать новые подключения к серверу для настройки производительности или балансировки нагрузки. По умолчанию новое подключение к серверу запускается всякий раз, когда это необходимо. Если настроено максимально допустимое число подключений к серверу, пакет SDK не запускает новые подключения, когда количество подключений сервера достигает предела.
ApplicationName
- Значение по умолчанию:
null
. - Этот параметр может быть полезен, если вы хотите предоставить общий доступ к одному экземпляру Azure SignalR для разных серверов приложений, содержащих одинаковые имена концентраторов. Если не задано, все подключенные серверы приложений считаются экземплярами одного приложения.
ClaimsProvider
- Значение по умолчанию:
null
. - Этот параметр управляет утверждениями, которые необходимо связать с подключением клиента.
Он используется при создании маркера доступа для клиента в запросе на согласование клиента.
По умолчанию все утверждения из
HttpContext.User
согласованного запроса зарезервированы. К нейHub.Context.User
можно получить доступ. - Как правило, этот параметр следует оставить как есть. Убедитесь, что вы понимаете, что происходит перед настройкой.
AccessTokenLifetime
- Значение по умолчанию:
1 hour
. - Этот параметр определяет допустимое время существования маркера доступа, создаваемый пакетом SDK службы для каждого клиента. Маркер доступа возвращается в ответ на запрос на согласование клиента.
- Когда
ServerSentEvent
илиLongPolling
используется в качестве транспорта, подключение клиента будет закрыто из-за сбоя проверки подлинности после истечения срока действия. Это значение можно увеличить, чтобы избежать отключения клиента.
AccessTokenAlgorithm
- Значение по умолчанию —
HS256
- Этот параметр предоставляет выбор
SecurityAlgorithms
при создании маркера доступа. Теперь поддерживаютсяHS256
необязательные значения иHS512
. Обратите внимание, чтоHS512
более безопасный, но созданный маркер сравнительно длиннее, чем используетсяHS256
.
ServerStickyMode
- Значение по умолчанию:
Disabled
. - Этот параметр задает режим для прилипания сервера. Когда клиент направляется на сервер, с которым он сначала ведет переговоры, мы называем его липким сервером.
- В распределенных сценариях может быть несколько серверов приложений, подключенных к одному экземпляру Azure SignalR. Как объясняют внутренние подключения клиентов, клиент сначала ведет переговоры с сервером приложений, а затем перенаправляется в Azure SignalR, чтобы установить постоянное подключение. Затем Azure SignalR находит один сервер приложений для обслуживания клиента, как объясняет транспорт данных между клиентом и сервером .
- Когда
Disabled
клиент направляется на случайный сервер приложений. Как правило, серверы приложений имеют сбалансированные клиентские подключения с этим режимом. Если ваши сценарии широковещательны или групповые отправки, используйте этот параметр по умолчанию достаточно. - Когда
Preferred
Azure SignalR пытается найти сервер приложений, с которым клиент сначала согласен, так как не требуется никакой другой стоимости или глобальной маршрутизации. Это может быть полезно при отправке сценария в подключение*. Отправка в подключение может иметь более высокую производительность и меньшую задержку, когда отправитель и получатель перенаправляются на тот же сервер приложений. - Когда
Required
Azure SignalR всегда пытается найти сервер приложений, с которым клиент сначала согласуется. Этот параметр может быть полезен, если некоторый контекст клиента извлекается изnegotiate
шага и хранится в памяти, а затем используется внутриHub
s. Однако этот вариант может иметь недостатки производительности, так как для этого требуется Azure SignalR предпринять другие усилия для глобального поиска этого конкретного сервера приложений, а также для глобальной маршрутизации трафика между клиентом и сервером.
- Когда
GracefulShutdown
GracefulShutdown.Mode
- Значение по умолчанию —
Off
- Этот параметр указывает поведение после того, как сервер приложений получает SIGINT (CTRL+C).
- Если задано значение
WaitForClientsClose
,вместо немедленной остановки сервера, мы удаляем его из Служба Azure SignalR, чтобы предотвратить назначение новых клиентских подключений этому серверу. - При установке значения
MigrateClients
, кроме того, мы пытаемся перенести клиентские подключения на другой допустимый сервер. Миграция будет активирована только после доставки сообщения.OnConnected
иOnDisconnected
активируются при переносе подключений в систему и выходе.IConnectionMigrationFeature
вы можете определить, переносится ли подключение в систему или выходить.- Ознакомьтесь с нашими примерами кодов для подробного использования.
GracefulShutdown.Timeout
- Значение по умолчанию —
30 seconds
- Этот параметр указывает самое длительное время ожидания закрытия или переноса клиентов.
ServiceScaleTimeout
- Значение по умолчанию —
5 minutes
- Этот параметр задает самое длительное время ожидания динамических конечных точек службы масштабирования, которые влияют на сетевые клиенты как минимум. Как правило, динамический масштаб между одним сервером приложений и конечной точкой службы может быть завершен в секундах, учитывая наличие нескольких серверов приложений и нескольких конечных точек службы с сетевым jitter и хотите обеспечить стабильность клиента, это значение можно настроить соответствующим образом.
MaxPollIntervalInSeconds
- Значение по умолчанию —
5
- Этот параметр определяет максимальный интервал опроса, разрешенный для
LongPolling
подключений в Служба Azure SignalR. Если следующий запрос опроса не войдетMaxPollIntervalInSeconds
, Служба Azure SignalR очищает подключение клиента. - Значение ограничено
[1, 300]
.
TransportTypeDetector
- Значение по умолчанию: все транспорты включены.
- Этот параметр определяет функцию для настройки транспорта, которые клиенты могут использовать для отправки HTTP-запросов.
- Используйте эти параметры вместо
HttpConnectionDispatcherOptions.Transports
настройки транспорта.
AllowStatefulReconnects
- Значение по умолчанию —
null
- Этот параметр включает или отключает повторное подключение с отслеживанием состояния для всех центров.
- Если
null
пакет SDK считывает параметры концентратора. - Если
true
Служба Azure SignalR включите повторное подключение с отслеживанием состояния во всех объявленных центрах. И клиентам требуется включить повторное подключение с отслеживанием состояния на стороне клиента. - Если
false
Служба Azure SignalR отключит повторное подключение с отслеживанием состояния во всех объявленных центрах.
Пример
Вы можете настроить приведенные выше параметры, как в следующем примере кода.
services.AddSignalR()
.AddAzureSignalR(options =>
{
options.InitialHubServerConnectionCount = 10;
options.AccessTokenLifetime = TimeSpan.FromDays(1);
options.ClaimsProvider = context => context.User.Claims;
options.GracefulShutdown.Mode = GracefulShutdownMode.WaitForClientsClose;
options.GracefulShutdown.Timeout = TimeSpan.FromSeconds(10);
options.TransportTypeDetector = httpContext => AspNetCore.Http.Connections.HttpTransportType.WebSockets | AspNetCore.Http.Connections.HttpTransportType.LongPolling;
});
Для устаревшего ASP.NET SignalR
Примечание.
Если вы впервые пытаетесь использовать SignalR, рекомендуется использовать ASP.NET Core SignalR, проще , надежнее и проще использовать.
Установка пакета SDK
Установите пакет SDK Служба SignalR в проект ASP.NET с помощью консоли диспетчер пакетов:
Install-Package Microsoft.Azure.SignalR.AspNet
Startup
В классе используйте пакет SDK Служба SignalR в качестве следующего фрагмента кода, замените MapSignalR()
MapAzureSignalR({your_applicationName})
на . Замените {YourApplicationName}
имя приложения уникальным именем, чтобы отличить это приложение от других приложений. Вы можете использовать this.GetType().FullName
как значение.
public void Configuration(IAppBuilder app)
{
app.MapAzureSignalR(this.GetType().FullName);
}
Настройка строки подключения
Задайте строка подключения в web.config
файле в connectionStrings
разделе:
<configuration>
<connectionStrings>
<add name="Azure:SignalR:ConnectionString" connectionString="Endpoint=...;AccessKey=..."/>
</connectionStrings>
...
</configuration>
Настройка параметров
При использовании пакета SDK для Служба Azure SignalR можно настроить несколько вариантов.
ConnectionString
- Значение по умолчанию — это
Azure:SignalR:ConnectionString
connectionString
appSetting
или вweb.config
файле. - Его можно перенастроить, но убедитесь, что значение не закодировано.
InitialHubServerConnectionCount
- Значение по умолчанию:
5
. - Этот параметр определяет начальное количество подключений на концентратор между сервером приложений и Служба Azure SignalR. Обычно держите его достаточно, так как значение по умолчанию достаточно. Во время выполнения пакет SDK может запускать новые подключения к серверу для настройки производительности или балансировки нагрузки. При наличии большого количества клиентов вы можете дать ему большее число для повышения пропускной способности. Например, если у вас есть 100 000 клиентов в общей сложности, число подключений может быть увеличено до
10
или15
.
MaxHubServerConnectionCount
- Значение по умолчанию:
null
. - Этот параметр определяет максимальное количество подключений, разрешенных для каждого концентратора между сервером приложений и Служба Azure SignalR. Во время выполнения пакет SDK может запускать новые подключения к серверу для настройки производительности или балансировки нагрузки. По умолчанию новое подключение к серверу запускается всякий раз, когда это необходимо. Если настроено максимально допустимое число подключений к серверу, пакет SDK не запускает новые подключения, когда количество подключений сервера достигает предела.
ApplicationName
- Значение по умолчанию:
null
. - Этот параметр может быть полезен, если вы хотите предоставить общий доступ к одному экземпляру Azure SignalR для разных серверов приложений, содержащих одинаковые имена концентраторов. Если не задано, все подключенные серверы приложений считаются экземплярами одного приложения.
ClaimProvider
- Значение по умолчанию:
null
. - Этот параметр управляет утверждениями, которые необходимо связать с подключением клиента.
Он используется при создании маркера доступа для клиента в запросе на согласование клиента.
По умолчанию все утверждения из
IOwinContext.Authentication.User
согласованного запроса зарезервированы. - Как правило, этот параметр следует оставить как есть. Убедитесь, что вы понимаете, что происходит перед настройкой.
AccessTokenLifetime
- Значение по умолчанию:
1 hour
. - Этот параметр управляет допустимым временем существования маркера доступа, который пакет SDK службы создает для каждого клиента. Маркер доступа возвращается в ответ на запрос на согласование клиента.
- Когда
ServerSentEvent
илиLongPolling
используется в качестве транспорта, подключение клиента будет закрыто из-за сбоя проверки подлинности после истечения срока действия. Это значение можно увеличить, чтобы избежать отключения клиента.
AccessTokenAlgorithm
- Значение по умолчанию —
HS256
- Этот параметр предоставляет выбор
SecurityAlgorithms
при создании маркера доступа. Теперь поддерживаютсяHS256
необязательные значения иHS512
. Обратите внимание, чтоHS512
более безопасный, но созданный маркер сравнительно длиннее, чем используетсяHS256
.
ServerStickyMode
- Значение по умолчанию:
Disabled
. - Этот параметр задает режим для прилипания сервера. Когда клиент направляется на сервер, с которым он сначала ведет переговоры, мы называем его липким сервером.
- В распределенных сценариях может быть несколько серверов приложений, подключенных к одному экземпляру Azure SignalR. Как объясняют внутренние подключения клиентов, клиент сначала ведет переговоры с сервером приложений, а затем перенаправляется в Azure SignalR, чтобы установить постоянное подключение. Затем Azure SignalR находит один сервер приложений для обслуживания клиента, как объясняет транспорт данных между клиентом и сервером .
- Когда
Disabled
клиент направляется на случайный сервер приложений. Как правило, серверы приложений имеют сбалансированные клиентские подключения с этим режимом. Если ваши сценарии широковещательны или групповые отправки, используйте этот параметр по умолчанию достаточно. - Когда
Preferred
Azure SignalR пытается найти сервер приложений, с которым клиент сначала согласен, так как не требуется никакой другой стоимости или глобальной маршрутизации. Это может быть полезно при отправке сценария в подключение*. Отправка в подключение может иметь более высокую производительность и меньшую задержку, когда отправитель и получатель перенаправляются на тот же сервер приложений. - Когда
Required
Azure SignalR всегда пытается найти сервер приложений, с которым клиент сначала согласуется. Этот параметр может быть полезен, если некоторый контекст клиента извлекается изnegotiate
шага и хранится в памяти, а затем используется внутриHub
s. Однако этот вариант может иметь недостатки производительности, так как для этого требуется Azure SignalR предпринять другие усилия для глобального поиска этого конкретного сервера приложений, а также для глобальной маршрутизации трафика между клиентом и сервером.
- Когда
MaxPollIntervalInSeconds
- Значение по умолчанию —
5
- Этот параметр определяет максимальное время простоя, допустимое для неактивных подключений в Служба Azure SignalR. В ASP.NET SignalR применяется к типу транспорта или повторному подключению для длинного опроса. Если следующий
/reconnect
или/poll
запрос не вступают вMaxPollIntervalInSeconds
систему, Служба Azure SignalR очищает подключение клиента. - Значение ограничено
[1, 300]
.
Пример
Вы можете настроить приведенные выше параметры, как в следующем примере кода.
app.Map("/signalr",subApp => subApp.RunAzureSignalR(this.GetType().FullName, new HubConfiguration(), options =>
{
options.InitialHubServerConnectionCount = 1;
options.AccessTokenLifetime = TimeSpan.FromDays(1);
options.ClaimProvider = context => context.Authentication?.User.Claims;
}));
Горизонтальное масштабирование сервера приложений
При использовании Служба Azure SignalR постоянные подключения выгружаются с сервера приложений, чтобы сосредоточиться на реализации бизнес-логики в классах концентраторов. Но вам по-прежнему необходимо масштабировать серверы приложений для повышения производительности при обработке массовых клиентских подключений. Ниже приведены несколько советов по масштабированию серверов приложений.
- Несколько серверов приложений могут подключаться к одному экземпляру Служба Azure SignalR.
- Если вы хотите предоставить общий доступ к одному экземпляру Azure SignalR для разных приложений с одинаковыми именами концентраторов, задайте их с разными параметрами ApplicationName . Если не задано, все подключенные серверы приложений считаются экземплярами одного приложения.
- Если параметр ApplicationName и имя класса концентратора совпадают, подключения с разных серверов приложений группируются в одном концентраторе.
- Каждое клиентское подключение создается только на одном из серверов приложений, а сообщения от этого клиента отправляются только на тот же сервер приложений. Если вы хотите получить доступ к данным клиента глобально (с всех серверов приложений), необходимо использовать централизованное хранилище для сохранения сведений о клиенте со всех серверов приложений.
Следующие шаги
Из этой статьи вы узнаете, как использовать Служба SignalR в приложениях. Дополнительные сведения о Служба SignalR см. в следующих статьях.
Azure SignalR Service internals (Внутренние компоненты Службы Azure SignalR)