2016-12-08 2 views
0

Ich habe eine Website als Azure Web App ausgeführt, die für die Verwendung von SignalR und der Azure Service Bus-Scaleout-Backplane konfiguriert ist. Alles funktioniert gut und Clients verbinden sich über die/signal-URL und ich kann Daten vom Server zu den verbundenen Clients übertragen.Wie schiebe ich Daten von einem Konsolenprogramm über SignalR Websockets?

Ich habe auch mehrere Konsolen-Apps, die regelmäßig neue Daten ausführen und ausgeben. Ich möchte auch die neuen Daten an die mit dem Web verbundenen Clients weitergeben.

Wie kann ich meine Nicht-Web-Anwendungen mit SignalR verbinden? Alle Beispiele, die ich sehe, gehen davon aus, dass jeder Server im Scaleout-Cluster weborientiert ist. Gibt es eine spezielle Konfiguration, um externe Prozesse dem SignalR-Cluster beizutreten und Daten über die SignalR-Websocket-Verbindung an webverbundene Clients zu übertragen, ohne dass sie auch Web-Apps erstellen müssen?

+1

Mögliche Duplikate [Beispiel App der SignalR-Konsole] (http://stackoverflow.com/questions/11140164/signalr-console-app-example) – bartbje

+0

Nicht sicher, ob es das ist.Das Beispiel, das Sie verlinkt haben, zeigt, dass der Client sich direkt mit der Konsolen-App verbindet und die Konsolen-App einen SignalR-Endpunkt an Port 8088 anbietet. In meinem Fall wird sich der Client mit einem Webserver verbinden, der den Endpunkt und die Verbindung mit Clients verwaltet Die Konsolen-App überträgt Daten über die SignalR-Scaleout-Rückwandplatine, die der Webserver abrufen und an verbundene Clients senden muss. –

Antwort

1

Es gibt zwei Möglichkeiten.

erste Option

Sie können Ihre „Konsole apps“ auf die signalR Backplane verbinden, und diese Anwendungen werden in der Lage sein, Kunden Methoden, mit etwas zu nennen wie

var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
hub.Clients.All.doSomething("blah-blah"); 

Sie einen beliebigen Port verwenden können, für die signalR config aber gleiche Backplane Konfiguration und gleiche Hubs. Sie können Owin für das Selbsthosting verwenden. Niemand stellt eine Verbindung zu diesen Konsolen-Apps her.

Nachteile:

1) braucht Ihre Konsolenanwendungen SignalR.SelfHosting und Ihre Hubs Klassen zu verweisen. Aus Sicht der Architektur ist das nicht gut.

2) Ihre Konsolen-Anwendungen hören einige Ports (da sie SignalR-Server sind). Theoretisch könnte sich jemand mit diesen Hubs verbinden und etwas tun. Dies ist weder aus Sicht der Architektur noch aus Sicherheitsgründen gut.

Zweite Option

Sie können Hub implementieren Methode wie "PushSomeDataToClients" und nennen es von der Konsole apps SignalR Client wie in @bartbje Kommentar erwähnt werden.

Vorteile: keine Nachteile von der ersten Option.

Nachteile: Sie müssen einige Sicherheitsmaßnahmen implementieren, um zu verhindern, dass jemand außerhalb des Systems diese Methode aufruft. SignalR hat eine Menge zu tun, also googeln Sie einfach. Sie können beispielsweise einen separaten Hub für die Kommunikation zwischen Systemen erstellen.

dritte Option

Interact mit Web-Server-Anwendungen mit einer anderen Art und Weise dann SignalR. Wahrscheinlich benutzen Sie bereits etwas wie rabbitMq oder irgendeine Art von Servicebus. Sie können es auch mit einem separaten ApiController in Ihrer Web-Server-App implementieren. Aber es scheint näher an der zweiten Option zu liegen.

Aufgrund meiner, würde ich wahrscheinlich die dritte Option wählen, da es aus Sicht der Architektur sauber ist.

+0

Gute Idee mit der dritten Option. –

Verwandte Themen