Nachricht von–SingnalR is calling

Im Web löst ein Client (in der Regel ein Browser) einen Request an eine Server aus und der Antwortet .. irgendwann. Schon lange herrscht das Bedürfnisse vom Server einen Push an den Client durchzuführen, z.B. Chat. Wenn einen neue Nachricht da ist, gleich anzeigen, oder auch ganz spannend im LOB Umfeld, wenn der Benutzer einen Datensatz anzeigt oder bearbeitet, eine Benachrichtigung, wenn jemand zweiter das tut. Ganz ohne Record Locking.

Die Mechanismen sind schon lange vorhanden. Neu hinzugekommen ist im HTML Standard WebSocket, die das Duplex Communication viel effizienter lösen. Allerdings bleibt eine Grundanforderung, das der Client die Verbindung Initial öffnen muss. Es braucht als einen Server, der sozusagen das Message Routing vornimmt.

SingnalR ist nun eigentlich nur eine komfortable Library von Microsoft um Websockets, Frames und co außen rum. Für Web (also JavaScript), .NET, Silverlight und auch WinRT.

Am Beginn steht das Nuget Packet zu installieren. Als nächstes wird in der global.asax das Routing eingerichtet. Ähnlich wie Web Api oder ASP.NET MVC gibt es eine Standard Router, hier “hub”.

   1:  Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
   2:          RouteTable.Routes.MapHubs()
   3:      End Sub

 

Die Nachrichtenzentrale ist eine Klasse die von Hub geerbt wird. In diesem VB.NET Beispiel wird eine Zahl erhalten, um eins inkrementiert und an all weiter gereicht.

   1:  Imports Microsoft.AspNet.SignalR
   2:  Imports Microsoft.AspNet.SignalR.Hubs
   3:   
   4:  <HubName("Hannes2")>
   5:  Public Class Hannes1Hub
   6:      Inherits Hub
   7:      Public Sub Hannes1(i As Integer)
   8:          ' Clients.Others.Hannestatwas(i + 1)
   9:          Clients.All.Hannestatwas(i + 1)
  10:   
  11:      End Sub
  12:   
  13:  End Class

Wichtig ist in Zeile 4 der Name, der nach Außen die Schnittstelle identifiziert (hannes2). Soweit ich eruiert habe, spielt der Name der Klasse keine Rolle. Die Methode in Zeile 7 wird dann vom Client aufgerufen und am Client die Methode in Zeile 9 (hannerstatwas) initiiert im Sinne eines Callbacks. Es gibt eine Reihe von Optionen die Anzahl der Endgeräte zu beschränken oder auch  nur einzelne User anzusprechen.

In einer HTML Seite wird dann die Anzeige und Aktion definiert. Sehr wichtig sind die JavaScript Referenzen

   1:  <script src="Scripts/jquery-2.0.3.min.js"></script>
   2:  <script src="Scripts/jquery.signalR-1.1.2.min.js"></script>
   3:  <script src="signalr/hubs"></script>

Die Referenz in Zeile 3 ist eine virtuelle und stellt den Proxy dar.

Weiters wird die Connection in Zeile 4 geöffnet und der Callback für den Browser angelegt. Als kleine optische Hilfe für den Benutzer zählt meine Anzeige von 0 auf 1 hoch, wenn die Verbindung erfolgreich gestartet wurde (Zeile 9)

 

   1:   <form id="form1" runat="server">
   2:          <script >var hub
   3:              $(function () {
   4:                  hub = $.connection.Hannes2;
   5:                  hub.client.Hannestatwas = function (i) {
   6:                      $("#empfange").text(i) ;
   7:                  };
   8:                  $.connection.hub.start().done(function () {
   9:                      $("#empfange").text(1);
  10:                  });
  11:              });
  12:              function sende() {
  13:                 
  14:                  hub.server.hannes1($("#empfange").text()); //proxy macht lowcase 
  15:              }
  16:          </script>
  17:      <div>
  18:          <div id="empfange">0</div>
  19:          
  20:          <input id="Button1" type="button" value="sende"  onclick="sende();"/>
  21:    </div>

 

In Ziel 14 wird das senden einer ASP.NET Signal R Nachricht behandelt, wobei mir aufgefallen ist, das im VB.NET Klasse eigentlich mit einem Großbuchstaben beginnt, aber im Browser mit kleinem Buchstaben ankommt. Fiddler hat mir das wieder mal verraten. Wobei Websocket Nachrichten nicht per Fiddler gesichtet werden können. Der HTTP Code 101 verrät den Protokoll Wechsel.

image

Das Protokoll ist  nun Verbindunglos und wir haben ein Risiko Nachrichten zu verlieren. Das sieht man im nächsten Teil einer Windows 8 (METRO, WinRT, Store App, modern UI : [SEO] ) ganz gut. Diese Anwendungen sind Systembedingt nicht dauernd im Vordergrund und bekommen gar nicht mit was alles läuft.

In Windows 8 (vermutlich Windows 8.1) wird der Proxy in Zeile 7 generiert und eine Delegate Funktion um die ankommenden Nachrichten zu verarbeiten. Dabei kommt man aber aus dem Background Thread in den UI Thread und muss entsprechende Dispatchen (Codezeile 14)

   1:     Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
   2:          hub.Invoke("hannes1", "5").Wait()
   3:      End Sub
   4:      Dim hub As IHubProxy
   5:      Private Async Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
   6:          Dim hubConn = New HubConnection("http://localhost:55542/")
   7:          hub = hubConn.CreateHubProxy("Hannes2")
   8:          hub.On(Of Integer)("Hannestatwas", AddressOf hannestatwas)
   9:          Await hubConn.Start()
  10:          text1.Text = 1
  11:      End Sub
  12:   
  13:      Private Async Function hannestatwas(i As Integer) As Task
  14:          Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, Sub() text1.Text = i)
  15:      End Function

Die Windows 8 App ist nicht ganz konsistent, weil sie nur die Nachricht “5” an den Hub schicken kann, im Button Click Event. Ich wollte hier den XAML Code sparen.

Wie sieht's nun mit dem Traffic aus der generiert wird? Die Antwort  darauf kann Chrome liefern und beim Trouble Shooting helfen. Man erkennt, das JSON Format (erste Zeile 28 Bytes) das meines Wissens nach nicht standardisiert ist.

image

 

Abschließend kann ich noch nicht beurteilen welche Risiken im Einsatz des Signal R Frameworks liegen. Da die Softwerker aus Redmond nur auf bekannte Standards setzen und Fallback Mechanismen einsetzen sollte es dazu keinen Probleme kommen. Auch das Thema Sicherheit bzw. Verschlüsselung wurde angedacht. Das Microsoft keine 10 Jahre Support mehr anbietet (wie z.B. bei Silverlight) mussten sie wohl das ganze als Open Source auf Github bereit stellen. Zusätzlich ist aktuell ein Trend auf Portable Librarys und Self Hosting per Owin zu setzen. Mit der Version 2.0 ist dies möglich.

Kommentare sind geschlossen