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.

Autor Alejandro Amrein
Datum 13.03.2014
Lesezeit 5 Minuten

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

 

signalr-web-applikationen_01

Implementationsbeispiel:

setInterval(function() {
$.ajax({
url: "server",
success: function(data) {
// data verwenden
},
dataType: "json"
});
}, 30000);

 

  • Long Polling
    • Verschwendet Server Threads und Verbindungsressourcen

 

signalr-web-applikationen_02

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-web-applikationen_03

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):

signalr-web-applikationen_04

signalr-web-applikationen_05

Als Nächstes must man SignalR in der OWIN Pipeline hinzufügen (siehe Blog zu Open Web Interface for .NET (OWIN))

signalr-web-applikationen_06

signalr-web-applikationen_07

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.

signalr-web-applikationen_08

signalr-web-applikationen_09

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:

signalr-web-applikationen_10

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).

signalr-web-applikationen_11

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:

signalr-web-applikationen_12

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.


Über den Autor

Alejandro Amrein

Alejandro Amrein, geboren in Argentinien, doktorierte 1986 an der ETH Zürich in numerischer Mathematik. Seit mehr als 15 Jahre arbeitet er als unabhängiger Entwickler, Berater und Trainer in Software Development mit Schwergewicht auf Microsoft Entwicklungstechnologien. Als Microsoft Certified Professional Developer (MCPD) und Microsoft Certified Trainer (MCT) unterrichtet er für Digicomp Academy AG verschiedene Kurse (C/C++, ASP.NET, C#, VB.NET, SharePoint, jQuery, WPF, u.a.).