WebSocket auf C#: Erstellung von Echtzeit-Anwendungen in .NET
Moderne Webanwendungen erfordern zunehmend eine sofortige Datenübertragung zwischen Client und Server. Das traditionelle HTTP-Protokoll, das nach dem „Anfrage-Antwort"-Schema arbeitet, ist nicht immer effizient für Aufgaben, bei denen die Häufigkeit und Geschwindigkeit von Aktualisierungen wichtig ist – Chats, Online-Spiele, Börsenkurse, Überwachungssysteme. Hier kommt das WebSocket-Protokoll zur Hilfe, das eine permanente bidirektionale Verbindung herstellt. In diesem Artikel werden wir im Detail besprechen, wie man WebSocket in C# (.NET) implementiert, einen vollwertigen Server und Client erstellt und die besten Praktiken betrachtet.
Was ist WebSocket und warum wird es in .NET benötigt?
WebSocket ist ein Protokoll, das über TCP arbeitet und eine Vollduplex-Kommunikation ermöglicht. Nach dem Verbindungsaufbau über einen HTTP-Handshake können Daten ohne zusätzlichen Overhead in beide Richtungen übertragen werden. Im Gegensatz zu Long Polling oder Server-Sent Events bietet WebSocket minimale Latenz und geringen Traffic.
Im .NET-Ökosystem gibt es zwei Hauptansätze für die Arbeit mit Echtzeit:
- Natives WebSocket (System.Net.WebSockets) – eine Low-Level-API, verfügbar in ASP.NET Core. Bietet volle Kontrolle über die Verbindung, geeignet für benutzerdefinierte Protokolle.
- SignalR – eine High-Level-Bibliothek von Microsoft, die WebSocket abstrahiert und automatisch den Transport auswählt (WebSocket, SSE, Long Polling). Ideal für typische Aufgaben (Chats, Benachrichtigungen).
Die Wahl hängt von der Aufgabe ab: Wenn Sie maximale Kontrolle und Leistung benötigen, verwenden Sie natives WebSocket; wenn Entwicklungsgeschwindigkeit und Einfachheit im Vordergrund stehen, verwenden Sie SignalR.
Erstellung eines WebSocket-Servers in C# (ASP.NET Core)
Betrachten wir eine schrittweise Implementierung des Servers. Zuerst erstellen wir ein ASP.NET Core-Projekt (leere Vorlage oder Web API).
Schritt 1: Middleware-Konfiguration
Fügen Sie die WebSocket-Unterstützung in der Configure-Methode der Datei Program.cs hinzu:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
app.UseWebSockets(); // WebSocket-Unterstützung aktivieren
app.Map("/ws", async (HttpContext context) =>{ if (context.WebSockets.IsWebSocketRequest) { using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await HandleWebSocketConnection(webSocket); } else { context.Response.StatusCode = 400; }});
app.Run();
async Task HandleWebSocketConnection(WebSocket webSocket){ var buffer = new byte[1024 * 4]; while (webSocket.State == WebSocketState.Open) { var result = await webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync( WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); } else if (result.MessageType == WebSocketMessageType.Text) { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine($"Empfangen: {message}");
// Echo-Antwort var response = Encoding.UTF8.GetBytes($"Echo: {message}"); await webSocket.SendAsync( new ArraySegment<byte>(response), WebSocketMessageType.Text, true, CancellationToken.None); } }}Dieser Code erstellt einen Echo-Server: Er empfängt Textnachrichten und sendet sie mit dem Präfix "Echo:" zurück. Beachten Sie die Verwaltung des Verbindungsstatus und die Behandlung der Schließung.
Schritt 2: Verwaltung mehrerer Verbindungen
In einer realen Anwendung müssen Sie eine Liste der aktiven Verbindungen speichern. Verwenden Sie ConcurrentDictionary oder ConcurrentBag:
public class WebSoc