SignalR: Echtzeit-Client/Server-Kommunikation
SignlR macht die bidirektionale und dauerhafte Verbindung zwischen Server und Client möglich. Dadurch können ASP.NET-Entwickler in Echtzeit arbeiten. Kursleiter Alejandro Amrein zeigt anhand eines einfachen Beispiels auf, wie diese Technologie genutzt werden kann.
Vor allem Collaboration-fähige Web-Applikationen erfordern immer mehr die Möglichkeit, Nachrichten vom Server aus in die Clients zu pushen. Das liegt nicht in der Natur von HTTP. HTTP ist ein state-less Protokoll, d.h. der Client (meistens ein Browser) macht eine Abfrage, die Verbindung öffnet sich, der Server bearbeitet die Abfrage und gibt eine Antwort zurück. Dann wird die Verbindung getrennt.
Ziel von SignalR ist es, bidirektionale, dauerhafte Verbindungen zwischen Client und Server in einer einfachen und zuverlässigen Art und Weise zu erreichen.
Wie kommunizierte man vor SignalR in Echtzeit?
Vor SignalR hat es verschiedene Methoden gegeben, wie Client und Server in einer Web-Applikation kommunizieren konnten:
- HTML WebSockets
- Nicht alle Browser unterstützen es und wenn, dann nicht in einer konsistenten Art und Weise
- Nicht alle Web Server unterstützen es
- Es sind raw Sockets (wir sind für die Semantik des Protokolls zuständig)
- Nicht alle Proxy Server unterstützen es
- Periodisches Polling
- Jede Millisekunde wird der Server gefragt, ob er etwas Neues hat
- Verschwendet Bandbreite
- Ist nicht wirklich Echtzeit
Implementationsbeispiel:
setInterval(function() {
$.ajax({
url: "server",
success: function(data) {
// data verwenden
},
dataType: "json"
});
}, 30000);
- Long Polling
- Verschwendet Server Threads und Verbindungsressourcen
Implementationsbeispiel:
(function poll() {
$.ajax({
url: "server",
success: function(data){
// data verwenden
},
dataType: "json",
complete: poll,
timeout: 30000
});
})();
SignalR-Lösung
In einer ähnlichen Weise wie WCF eine Abstraktion aller möglichen Kommunikationstechnologien darstellt, stellt SignalR eine Art Abstraktion über die oben erwähnten Technologien. Das heisst, SignalR benützt im Hintergrund diese Technologien, stellt dem Entwickler aber eine einfache und konsistente Schnittstelle zur Verfügung. Der Entwickler definiert JavaScript-Funktionen Client-seitig und .NET-Methoden Server-seitig und sorgt dafür, dass eine dauerhafte Verbindung zwischen beiden entsteht, durch die die eine Seite die Funktionen der anderen Seite einfach aufrufen kann.
SignalR bietet viele Möglichkeiten. Ich zeige in diesem Beitrag ein einfaches Beispiel, sodass Sie schnell in die Technologie einsteigen können. Sie werden feststellen, wie einfach es ist, eine Echtzeit-Kommunikation zu erzeugen.
Im Folgenden werde ich Schritt für Schritt eine «Hello world»-Applikation erstellen:
Schritt 1: Erstellung und Einstellung des Projekts
Wir starten Visual Studio 2013 und erstellen eine neue leere Web-Applikation (HelloSignalR). In Visual Studio 2013 ist SignalR eingebaut. Wenn man mit früheren Versionen von Visual Studio arbeitet, muss man SignalR als NuGet Package installieren (mehr dazu unter http://www.asp.net/signalr):
Als Nächstes must man SignalR in der OWIN Pipeline hinzufügen (siehe Blog zu Open Web Interface for .NET (OWIN))
Schritt 2: Den Server vorbereiten
Server-seitig müssen wir einen sogenannten Hub erstellen. Dieser stellt unsere Verbindung dar und stellt dem Client eine Reihe von Methoden (in diesem Fall nur eine: die hello-Methode) zur Verfügung.
Schritt 3: Den Client vorbereiten
Der Client-Code besteht aus zwei Teilen:
- HTML-Seite
- JavaScript-Funktionalität
Die HTML-Seite beinhaltet lediglich ein TextBox, einen Button und ein DIV:
Die erwähnte JavaScript-Funktionalität registriert sich gegenüber dem Server Hub (helloHub) und registriert die Funktion broadcastMessage. Ausserdem wird die Verbindung gestartet und wenn diese erstellt wird, wird ein Click-Ereignis-Handler deklariert, damit beim Klick auf den Button die (Server-seitige) hello-Funktion mit den eingegebenen Namen aufgerufen wird (diese verteilt dann die Nachricht zu den anderen Sitzungen).
Schritt 4: Testen
Zum Testen starten wir drei verschiedene Browser-Sitzungen und geben in der Sitzung 1 einen Name ein (Alejandro). Unmittelbar erscheint der Name Alejandro in den anderen Sitzungen (Clients.Others schliesst alle registrierten Sitzungen ein, ausser die aktuelle). Danach geben wir in der Sitzung 2 Peter ein und in der Sitzung 3 Hans.
Das ist das Resultat:
Fazit
SignalR abstrahiert die verschiedenen verfügbaren Echtzeit-Kommunikations-Technologien (u.a. Periodoc Polling, Long polling, WebSocktes) und stellt eine vereinfachte Infrastruktur für Entwickler zur Verfügung. Dadurch können Sie diese Client- und Server-seitige Funktionen definieren, die sich dann gegenseitig aufrufen können.