Jak funguje základní signalR ASP.NET

Dokončeno

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:

  • Hub: Standardní centrum.
  • Hub<T>: Obecný rozbočovač silného typu.

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 NotifyAlla událost je NotificationReceived. NotificationHub je podtřídou třídy Hub. Metoda NotifyAll vrátí hodnotu Taska 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 a T 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 nebo Task<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

    ASP.NET centrum Core SignalR odesílající zprávu pomocí syntaxe Clients.All.

    Všichni připojení klienti obdrží tuto zprávu bez ohledu na skupinu, do které můžou nebo nemusí patřit.

  • Izolovaný uživatel

    ASP.NET centrum Core SignalR odesílající zprávu pomocí syntaxe Clients.User.

    Tuto zprávu obdrží jeden uživatel bez ohledu na to, kolik zařízení aktuálně používá.

  • Izolovaná skupina

    ASP.NET centrum Core SignalR odesílající zprávu pomocí syntaxe Clients.Group.

    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:

Alternativně můžete použít asynchronní rozhraní API obslužné rutiny, která jsou Func<TResult> místem, kde se jedná o variantu TResult Task :

Výsledkem registrace obslužné rutiny události je IDisposableobsluž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í HubConnectiona 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.