SignalR: Self-Hosting außerhalb ASP.NET Webanwendung

Veröffentlicht von Sascha am

SignalR ist eine prima Entwicklung des Jahres 2012. Aber nicht immer steht eine Webanwendung (ASP.NET) im Mittelpunkt des Projektes. SignalR lässt sich auch wunderbar als IPC Alternative zu NamedPipes auf der gleichen Maschine oder Sockets im Netzwerk verwenden. Das tolle daran ist, dass der SignalR Core einem bereits jede Menge arbeit abnimmt und man sich auf die Programmierung der Geschäftslogik konzentrieren kann ohne sich mit den unteren Schichten der Kommunikation herumschlagen zu müssen. Das Konzept der Hubs in SignalR ist grandios einfach.

Hier zeige ich euch, wie ihr SignalR außerhalb einer ASP.NET Webanwendung zum Laufen bekommt (Self Hosted).

Wir benötigen eine Klasse, in meinem Beispiel habe ich diese SignalRServer genannt:

public class SignalRServer
{
    private Microsoft.AspNet.SignalR.Hosting.Self.Server server;

    public void Start()
    {
        string url = "http://localhost:8081/";
        this.server = new Microsoft.AspNet.SignalR.Hosting.Self.Server(url);

        // Map the default hub url (/signalr)
        this.server.MapHubs();

        // Start the server
        this.server.Start();
    }

}

Die Start Methode startet den Server auf dem localhost mit Port 8081. Alle Klassen die von der SignalR Hub Klasse ableiten werden via Reflection gefunden und bei MapHubs() den Clients verfügbar gemacht.

Eine Beispiel Klasse für einen Hub könnte folgendermaßen aussehen:

[HubName("MyHub")]
public class MyHub : Hub
{
    public string SayHello(string Name)
    {
        Clients.All.returnRequest("Hello " + Name);
    }
}

Eine simple Methode namens SayHello(string Name) welche den Übergebenen Namen „begrüßt“. Dieser Gruß wird an allen Clients gesendet.

Der Client Code (der sich in einem anderen Projekt befinden kann) könnte in etwa so aussehen:

string ServerURL = "http://localhost:8081/";
var connection = new HubConnection(ServerURL);
IHubProxy Hub = connection.CreateHubProxy("MyHub");

connection.Start().ContinueWith(task =>
{
    if (task.IsFaulted)
        throw new Exception("Connection Failed: " + task.Exception.GetBaseException());
    else
    {
      // We are ready!
      // ...
    }
});

Hub.On("returnRequest", data =>
{
  // Do something with data
});

// Wir starten eine Connection zum SignalRServer der gleichnamigen Klasse und erstellen uns einen HubProxy von „MyHub“.
Nachdem eine Connection gestartet wurde und kein Fehler aufgetreten ist, steht die Verbindung und könnte Daten an den Hub senden.

Eingehende Requests werden mit dem Hub.On(„MethodenName“, returnValue => { /* .. */ }); Lambda-Konstrukt behandelt.

Da sich SignalR stetig in der Weiterentwicklung befindet kann es sein, dass dieser Code nicht lange Bestand hat.
Er wurde mit der SignalR Version 1.0.0 entwickelt.
Die im Server benötigten Verweiße sind:
– Microsoft.AspNet.SignalR.Core
– Microsoft.AspNet.SignalR.Hosting.AspNet
– Microsoft.AspNet.SignalR.Hosting.Common
– Microsoft.AspNet.SignalR.Hosting.Self
– Newtonsoft.Json

Im Client hingegen werden lediglich:
– Microsoft.AspNet.SignalR.Client
– Newtonsoft.Json

… benötigt. Die entsprechenden DLLs erhaltet ihr bei der Installation mittels Nu-Get oder auf der offiziellen SignalR Seite (github).

Kategorien: Allgemein

Kommentar verfassen

%d Bloggern gefällt das:

Durch das Fortsetzen der Benutzung dieser Seite, stimmst du der Benutzung von Cookies zu. Weitere Informationen

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter.

Schließen