Jak funguje základní signalR ASP.NET
Servery a Hub
třída
Třída Hub
je koncept serveru SignalR. Definuje se v rámci Microsoft.AspNetCore.SignalR
oboru názvů a je součástí balíčku NuGet Microsoft.AspNetCore.SignalR . ASP.NET core webových aplikací, které cílí na sadu Microsoft.NET.SDK.Web SDK, nemusí přidávat referenční informace k balíčku pro SignalR, protože je již k dispozici jako součást sdílené architektury.
Cesta Hub
je vystavena přes trasu. Například trasu https://www.contoso-pizza.com/hubs/orders
lze použít k reprezentaci OrdersHub
implementace. Prostřednictvím různých rozhraní API centra můžou autoři definovat metody a události.
Existují dva způsoby zveřejnění metod v centru. Vytvoříte podtřídu následujících typů a metod zápisu:
Příklad: Hub
Jako referenční bod zvažte následující Notification
objekt:
namespace RealTime.Models;
public record Notification(string Text, DateTime Date);
Objekt lze sdílet, když použijete klientskou sadu SDK .NET, aby server a klient měly přesně stejný objekt. Představte si centrum oznámení:
using Microsoft.AspNetCore.SignalR;
using System;
using System.Threading.Tasks;
using RealTime.Models;
namespace ExampleServer.Hubs;
public sealed class NotificationHub : Hub
{
public Task NotifyAll(Notification notification) =>
Clients.All.SendAsync("NotificationReceived", notification);
}
Pokud jde o rozdíl mezi metodami a událostmi, metoda v předchozí implementaci centra je NotifyAll
a událost je NotificationReceived
. NotificationHub
je podtřídou třídy Hub
. Metoda NotifyAll
vrátí hodnotu Task
a přijímá jeden Notification
parametr. Metoda je vyjádřena jako vyvolání SendAsync
z Clients.All
, který představuje všechny připojené klienty. Událost NotificationReceived
se aktivuje v závislosti na notification
instanci.
Instance IHubContext
Události se aktivuje buď z instanceHub
, nebo z instanceIHubContext
. Centrum SignalR je základní abstrakce pro odesílání zpráv klientům připojeným k serveru SignalR. Zprávy z jiných míst v aplikaci je také možné odesílat pomocí některého z následujících typů:
- IHubContext<THub>: Kontext, kde
THub
představuje standardní centrum. - IHubContext<THub,T>: Kontext, kde
THub
představuje obecné centrum silného typu aT
představuje odpovídající typ klienta.
Důležité
IHubContext
slouží k odesílání oznámení klientům. Nepoužívá se k volání metod na objektu Hub
.
Příklad IHubContext
Vzhledem k předchozí implementaci centra oznámení můžete použít následující:IHubContext<NotificationHub>
using Microsoft.AspNetCore.SignalR;
using System;
using System.Threading.Tasks;
using RealTime.Models;
namespace ExampleServer.Services;
public sealed class NotificationService(
IHubContext<NotificationHub> hubContext)
{
public Task SendNotificationAsync(Notification notification) =>
notification is not null
? hubContext.Clients.All.SendAsync("NotificationReceived", notification)
: Task.CompletedTask;
}
Předchozí kód jazyka C# se spoléhá na IHubContext<NotificationHub>
přístup k kontextovým výpisům klientů a vystavuje možnost vysílat oznámení. Primární hubContext
parametr konstruktoru zachycený v oboru se používá k vyvolání "NotificationReceived"
události, ale není určen k volání metody centra NotifyAll
.
Metody
Hub
nebo Hub<T>
metody jsou stejně jako všechny jiné metody jazyka C#. Definují návratový typ, název metody a parametry.
- Nejběžnější návratový typ pro metodu centra je
Task
neboTask<TResult>
, který představuje asynchronní operaci rozbočovače. - Název metody se používá k volání metody z klientů. Můžete ho přizpůsobit pomocí .HubMethodNameAttribute
- Parametry jsou volitelné, ale když jsou definované, očekává se, že klienti zadají odpovídající argumenty.
Metody nejsou potřeba k vyvolání událostí, ale často se používají.
Události
Událost se dá přihlásit k odběru podle názvu z klienta. Server zodpovídá za vyvolávání událostí. Hub
, Hub<T>
, IHubContext<THub>
a IHubContext<THub, T>
události jsou pojmenovány a mohou definovat až 10 parametrů. Události se aktivují na serveru a zpracovávají se zájemci. Klient se považuje za zájem, když se přihlásí k odběru událostí v připojení svého centra. Klienti můžou nepřímo aktivovat události, když volají metody centra, které aktivují události v důsledku jejich vyvolání. Události ale nemůžou přímo aktivovat klienti, protože je to zodpovědnost za server.
Obory klienta událostí
Voláte události z IClientProxy instance. Implementujete rozhraní IHubClients IHubCallerClients z Clients typu. Existuje mnoho způsobů, jak nastavit rozsah na konkrétní IClientProxy
instanci. Z vlastnosti můžete cílit na následující obory Hub.Clients
:
Člen | Detaily |
---|---|
All |
Všichni připojení klienti (například všesměrové vysílání). |
AllExcept |
Všichni připojení klienti s výjimkou zadaných připojení (například filtrovaného vysílání). |
Caller |
Připojený klient, který aktivoval metodu (například ozvěnu). |
Client |
Zadané připojení klienta (jedno připojení). |
Clients |
Zadaná klientská připojení (více připojení). |
Group |
Všichni připojení klienti v zadané skupině. |
GroupExcept |
Všichni připojení klienti v zadané skupině s výjimkou zadaných připojení. |
Groups |
Všichni připojení klienti v rámci zadaných skupin (více skupin). |
Others |
Všichni připojení klienti s výjimkou klienta, který aktivoval metodu. |
OthersInGroup |
Všichni připojení klienti v zadané skupině s výjimkou klienta, který metodu aktivoval. |
User |
Všichni připojení klienti pro zadaného uživatele (jeden uživatel se může připojit na více než jednom zařízení). |
Users |
Všichni připojení klienti pro zadané uživatele. |
Příklady oborů
Podívejte se na následující obrázky, které vám můžou pomoct vizualizovat, jak centrum odesílá zprávy cílovým klientům. Obrázky můžete rozšířit, aby se zlepšila čitelnost.
Všesměrové vysílání pro všechny
Všichni připojení klienti obdrží tuto zprávu bez ohledu na skupinu, do které můžou nebo nemusí patřit.
Izolovaný uživatel
Tuto zprávu obdrží jeden uživatel bez ohledu na to, kolik zařízení aktuálně používá.
Izolovaná skupina
Tuto zprávu obdrží jenom klienti, kteří patří do určité skupiny.
Klienti a HubConnection
třída
Třída HubConnection
je koncept klienta SignalR, který představuje připojení klienta k serveru Hub
. Definuje se v rámci Microsoft.AspNetCore.SignalR.Client
oboru názvů a je součástí balíčku NuGet Microsoft.AspNetCore.SignalR.Client .
Vytvoříte vzor HubConnection
tvůrce a odpovídající HubConnectionBuilder
typ. S ohledem na trasu centra (nebo System.Uri) můžete vytvořit HubConnection
. Tvůrce může také zadat další možnosti konfigurace, včetně protokolování, požadovaného protokolu, předávání ověřovacího tokenu a automatického opětovného připojení.
Rozhraní HubConnection
API zveřejňuje funkce spuštění a zastavení, které slouží ke spuštění a zastavení připojení k serveru. Kromě toho existují možnosti streamování, volání metod centra a přihlášení k odběru událostí.
HubConnection
Příklad vytvoření
K vytvoření objektu HubConnection
ze sady SDK klienta .NET SignalR použijte tento HubConnectionBuilder
typ:
using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Threading.Tasks;
using RealTime.Models;
namespace ExampleClient;
public sealed class Consumer : IAsyncDisposable
{
private readonly string HostDomain =
Environment.GetEnvironmentVariable("HOST_DOMAIN");
private HubConnection _hubConnection;
public Consumer()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl(new Uri($"{HostDomain}/hub/notifications"))
.WithAutomaticReconnect()
.Build();
}
public Task StartNotificationConnectionAsync() =>
_hubConnection.StartAsync();
public async ValueTask DisposeAsync()
{
if (_hubConnection is not null)
{
await _hubConnection.DisposeAsync();
_hubConnection = null;
}
}
}
Metody centra volání
Pokud je klientovi udělena instance klientaHubConnection
, která byla úspěšně spuštěna, může tento klient volat metody v centru pomocí InvokeAsync těchto rozšíření.SendAsync Pokud metoda centra vrátí Task<TResult>
, výsledek InvokeAsync<TResult>
je typu TResult
. Pokud se metoda centra vrátí Task
, neexistuje žádný výsledek. Oba InvokeAsync
a SendAsync
vyžadují název metody centra a nula až 10 parametrů.
- InvokeAsync: Vyvolá metodu centra na serveru pomocí zadaného názvu metody a volitelných argumentů.
- SendAsync: Vyvolá metodu centra na serveru pomocí zadaného názvu metody a volitelných argumentů. Tato metoda nečeká na odpověď příjemce.
Příklad vyvolání metody centra
Když SendNotificationAsync
přidáte metodu do předchozí Consumer
třídy, SendNotificationAsync
deleguje na _hubConnection
metodu a volá metodu NotifyAll
v centru serveru v závislosti na Notification
instanci.
public Task SendNotificationAsync(string text) =>
_hubConnection.InvokeAsync(
"NotifyAll", new Notification(text, DateTime.UtcNow));
Zpracování událostí
Pro zpracování událostí zaregistrujete obslužnou rutinu HubConnection
v instanci. Zavolejte jedno z HubConnectionExtensions.On přetížení, když znáte název metody centra a máte nula na osm parametrů. Obslužná rutina může splňovat některou z následujících Action
variant:
- Action
- Action<T>
- Action<T1,T2>
- Action<T1,T2,T3>
- Action<T1,T2,T3,T4>
- Action<T1,T2,T3,T4,T5>
- Action<T1,T2,T3,T4,T5,T6>
- Action<T1,T2,T3,T4,T5,T6,T7>
- Action<T1,T2,T3,T4,T5,T6,T7,T8>
Alternativně můžete použít asynchronní rozhraní API obslužné rutiny, která jsou Func<TResult>
místem, kde se jedná o variantu TResult
Task
:
Func<Task>
Func<T,Task>
Func<T1,T2,Task>
Func<T1,T2,T3,Task>
Func<T1,T2,T3,T4,Task>
Func<T1,T2,T3,T4,T5,Task>
Func<T1,T2,T3,T4,T5,T6,Task>
Func<T1,T2,T3,T4,T5,T6,T7,Task>
Func<T1,T2,T3,T4,T5,T6,T7,T8,Task>
Výsledkem registrace obslužné rutiny události je IDisposable
obslužná rutina , která slouží jako odběr. Chcete-li odhlásit obslužnou rutinu, zavolejte Dispose.
Příklad registrace události
Aktualizací předchozí Consumer
třídy se zaregistrujete k události poskytnutím obslužné rutiny a volání On
:
using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Threading.Tasks;
using RealTime.Models;
namespace ExampleClient;
public sealed class Consumer : IAsyncDisposable
{
private readonly string HostDomain =
Environment.GetEnvironmentVariable("HOST_DOMAIN");
private HubConnection _hubConnection;
public Consumer()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl(new Uri($"{HostDomain}/hub/notifications"))
.WithAutomaticReconnect()
.Build();
_hubConnection.On<Notification>(
"NotificationReceived", OnNotificationReceivedAsync);
}
private async Task OnNotificationReceivedAsync(Notification notification)
{
// Do something meaningful with the notification.
await Task.CompletedTask;
}
// Omitted for brevity.
}
Metoda OnNotificationReceivedAsync
se volá, když instance centra serveru aktivuje "NotificationReceived"
událost.
Aktualizace živých objednávek společnosti Contoso Pizza
Kód serveru webové aplikace musí mít Hub
implementaci a zpřístupnit trasu klientům. Pomocí Hub
jedinečného identifikátoru objektu objednávky můžete vytvořit skupinu pro sledování. Všechny aktualizace změn stavu objednávky se pak dají sdělit v této skupině.
Klientský kód by se také muset aktualizovat, aby indikoval, že aplikace Contoso Pizza je aplikace Blazor WebAssembly. Můžete použít sadu JavaScript SDK nebo klientskou sadu SDK .NET. Funkce dotazování na straně klienta byste nahradili kódem, který sestaví HubConnection
a pak spustí připojení k serveru. Při přechodu na stránku sledování objednávek by se kód musel připojit ke konkrétní skupině objednávky, kde se aktualizace změn odesílají. Přihlásili jste se k odběru události, aby se změnil stav objednávky, a pak byste ji mohli zpracovat odpovídajícím způsobem.