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 insteadTypisierte 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
Taskzurückgeben, nichtTask<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
- SignalR-Hubs und Verbindungen
- Gruppen, Benutzer und Verbindungsverwaltung
- Typsichere Hubs
- Skalierung mit Redis-Backplane