0Pricing
C# Academy · Lektion

Typsichere Hubs

Definieren Sie typisierte Hub-Schnittstellen, um kompilierzeitliche Sicherheit und IntelliSense für Aufrufe von Clientmethoden zu erhalten.

Typsichere Hubs ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Das Problem mit Methodennamen als Zeichenfolgen

Standard-SignalR-Aufrufe verwenden SendAsync("MethodName", ...) mit sogenannten Magic Strings. Ein Tippfehler im Methodennamen führt zu einem unbemerkten Fehler – der Client empfängt die Nachricht einfach nie. Stark typisierte Hubs lösen dieses Problem.

Die Client-Schnittstelle definieren

Erstellen Sie eine Schnittstelle, die jede Methode deklariert, die der Server auf dem Client aufrufen kann. Die Methodennamen und Parametertypen bilden Ihren Vertrag.

// INotificationClient.cs
public interface INotificationClient
{
    Task ReceiveMessage(string user, string message);
    Task OrderShipped(int orderId, string trackingNumber);
    Task UserJoined(string username);
    Task UserLeft(string username);
    Task SystemAlert(string message);
}

Einen stark typisierten Hub erstellen

Leiten Sie von Hub<T> ab, wobei T Ihre Client-Schnittstelle ist. Die Eigenschaft Clients ist nun typisiert – IntelliSense zeigt die verfügbaren Methoden an, und Tippfehler werden zu Compilerfehlern.

public class ChatHub : Hub<INotificationClient>
{
    public async Task SendMessage(string message)
    {
        var user = Context.User!.Identity!.Name ?? "Anonymous";

        // Compile-time safety — no magic strings!
        await Clients.All.ReceiveMessage(user, message);
        await Clients.Others.UserJoined(user); // IntelliSense works
    }
}

Bestimmte Clients mit einem typisierten Hub ansprechen

Alle standardmäßigen Methoden zur Zieladressierung funktionieren auch mit dem typisierten Hub: Clients.User, Clients.Group, Clients.Caller, Clients.Client – sie liefern alle die typisierte Schnittstelle zurück.

public async Task NotifyOrderShipped(int orderId, string customerId)
{
    await Clients.User(customerId)
                 .OrderShipped(orderId, "TRK-12345");

    await Clients.Group("admins")
                 .SystemAlert($"Order {orderId} shipped to {customerId}");

    await Clients.Caller.ReceiveMessage("System", "Notification sent");
}

Typisierter IHubContext

Fügen Sie IHubContext<THub, TClient> in Services ein, um auch beim Senden von Nachrichten außerhalb des Hubs dieselbe Sicherheit zur Compilezeit zu erhalten.

public class ShipmentService
{
    private readonly IHubContext<ChatHub, INotificationClient> _hub;

    public ShipmentService(
        IHubContext<ChatHub, INotificationClient> hub) => _hub = hub;

    public async Task ProcessShipmentAsync(int orderId, string customerId)
    {
        // Fully typed — no magic strings
        await _hub.Clients.User(customerId)
                  .OrderShipped(orderId, "TRK-99999");
    }
}

Regeln für die Client-Schnittstelle

Methoden in der Client-Schnittstelle müssen Task zurückgeben, nicht Task<T>. SignalR stößt Clientaufrufe an, ohne auf das Ergebnis zu warten – vom Client gibt es keinen Rückgabewert an den Server.

// CORRECT
public interface IMyClient
{
    Task ReceiveMessage(string msg);         // OK
    Task UpdateProgress(int percent);        // OK
    Task<string> GetUserInput();            // NOT SUPPORTED
}
// Return types other than Task are not supported in hub client interfaces
// For request-response patterns, use client-callable hub methods instead

Typisierte Hubs mit Gruppen kombinieren

Typisierte Gruppen funktionieren genauso wie nicht typisierte Gruppen – die API ist identisch, nur die Methodennamen werden zur Compilezeit geprüft.

public class RoomHub : Hub<IRoomClient>
{
    public async Task JoinRoom(string room)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, room);
        await Clients.Group(room).UserJoined(Context.User!.Identity!.Name!);
    }

    public async Task BroadcastToRoom(string room, string message)
    {
        var user = Context.User!.Identity!.Name!;
        await Clients.Group(room).ReceiveMessage(user, message);
    }
}

Stark typisierte Hubs testen

Da Aufrufe von Clientmethoden über eine Schnittstelle erfolgen, können Sie den Client in Unit-Tests mocken und überprüfen, ob die richtigen Methoden mit den passenden Argumenten aufgerufen wurden.

// NSubstitute test
var mockClients = Substitute.For<IHubCallerClients<INotificationClient>>();
var mockAllClients = Substitute.For<INotificationClient>();
mockClients.All.Returns(mockAllClients);

var hub = new ChatHub { Clients = mockClients };
await hub.SendMessage("Hello!");

await mockAllClients.Received(1).ReceiveMessage("System", "Hello!");

Mehrere Hubs pro Anwendung

Eine Anwendung kann für verschiedene Echtzeitfunktionen mehrere Hub-Endpunkte haben, jeweils mit einer eigenen typisierten Client-Schnittstelle.

// Three separate hubs
app.MapHub<ChatHub>("/hubs/chat");
app.MapHub<NotificationHub>("/hubs/notifications");
app.MapHub<DashboardHub>("/hubs/dashboard");

// Each with its own client interface:
// Hub<IChatClient>, Hub<INotificationClient>, Hub<IDashboardClient>

Strukturierte Daten senden

Methoden der Client-Schnittstelle können komplexe DTOs akzeptieren. SignalR serialisiert diese automatisch als JSON – stellen Sie sicher, dass Ihre Typen serialisierbar sind.

public interface IOrderClient
{
    Task OrderUpdated(OrderStatusDto status);
}

public record OrderStatusDto(
    int OrderId,
    string Status,
    decimal Total,
    DateTime UpdatedAt);

// Usage in hub:
await Clients.User(customerId).OrderUpdated(
    new OrderStatusDto(order.Id, order.Status.ToString(),
                       order.Total, DateTime.UtcNow));

Kurze Überprüfung

Welche Einschränkung gilt für den Rückgabetyp von Methoden in einer SignalR-Hub-Client-Schnittstelle?

Zusammenfassung: Stark typisierte Hubs

Wichtigste Erkenntnisse:

  • Definieren Sie eine Schnittstelle (IMyClient), die alle Methoden auflistet, die der Server auf Clients aufrufen kann
  • Leiten Sie von Hub<IMyClient> ab – die Eigenschaft Clients wird vollständig typisiert
  • Fügen Sie IHubContext<THub, TClient> ein, um typisierte Nachrichten von außerhalb des Hubs zu senden
  • Methoden der Client-Schnittstelle müssen Task zurückgeben, nicht Task<T>
  • Schnittstellenbasierte Clients können gemockt werden – stark typisierte Hubs lassen sich leichter testen

Häufig gestellte Fragen

Ist die Lektion „Typsichere Hubs“ kostenlos?

Ja — der vollständige Text von „Typsichere Hubs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Typsichere Hubs“?

Definieren Sie typisierte Hub-Schnittstellen, um kompilierzeitliche Sicherheit und IntelliSense für Aufrufe von Clientmethoden zu erhalten. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Typsichere Hubs“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. SignalR-Hubs und Verbindungen
  2. Gruppen, Benutzer und Verbindungsverwaltung
  3. Typsichere Hubs
  4. Skalierung mit Redis-Backplane
← Zurück zu C# Academy