2017-12-20 4 views
0

Use Case: Ich habe eine asp.net Core-Webanwendung mit SignalR Core für Messaging. :)asp.net Kern mit signalR < - > statischer Sockel

Problem: ich Nachrichten von einer Socket-Verbindung erhalten muß [via System.Net.Sockets] (Maschine mit eigener Socket-Kommunikation)

Gibt es eine Möglichkeit, den Socket-Client in der Integration Web App (vielleicht Progamm.cs oder Startup.cs?) Und wie bekomme ich Zugriff auf das SignalR, um die empfangene Nachricht an den SignalR Hub weiterzuleiten?

thx

Antwort

2

Ich schlage vor, Sie die Probe Stockticker zum: https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-server-broadcast-with-signalr

zeige ich Ihnen hier eine kleine Probe, die Sie an Ihre Anwendung anpassen können. Sie müssen die Nachrichten von Ihrer eigenen Socket-Kommunikation abonnieren und dann können Sie diese Nachrichten an die verbundenen Clients weiterleiten.

Hier ist ein kleines Beispiel, wie Sie die Zeit vom Server zu den Clients senden. (Der interessante Teil ist für Sie die Linie GlobalHost.ConnectionManager.GetHubContext<ClockHub>().Clients.All.sendTime(DateTime.UtcNow.ToString()); Welche dies Sie etwas an alle angeschlossenen Clients senden können

Meine Hauptklasse eine Uhr, die die aktuelle Zeit an alle angeschlossenen Clients sendet..

public class Clock 
{ 
    private static Clock _instance; 
    private Timer timer; 
    private Clock() 
    { 
     timer = new Timer(200); 
     timer.Elapsed += Timer_Elapsed; 
     timer.Start(); 
    } 

    private void Timer_Elapsed(object sender, ElapsedEventArgs e) 
    { // ---> This is the important part for you: Get hubContext where ever you use it and call method on hub    GlobalHost.ConnectionManager.GetHubContext<ClockHub>().Clients.All.sendTime(DateTime.UtcNow.ToString()); 
     GlobalHost.ConnectionManager.GetHubContext<ClockHub>().Clients.Clients() 
    } 

    public static Clock Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new Clock(); 
      } 
      return _instance; 
     } 
    } 
} 

}

In dem Anlauf ich eine sigleton Instanz dieser Uhr geschaffen, die, solange die Anwendung lebt laufen.

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var inst = Clock.Instance; 
      app.UseCors(CorsOptions.AllowAll); 
      app.MapSignalR();   
     } 
    } 
} 
Hub

My:

public class ClockHub : Hub<IClockHub> 
    { 

    } 

Hub-Schnittstelle, die das Verfahren definiert, das der Server anrufen:

public interface IClockHub 
    { 
     void sendTime(string actualTime); 
    } 

Dies ist der Kunde Teil:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <div id="timeLabel" ></div> 
    <script src="scripts/jquery-1.6.4.min.js"></script> 
    <script src="scripts/jquery.signalR-2.2.0.js"></script> 
    <script src="signalr/hubs"></script> 
    <script> 
     $(function() { // I use jQuery in this example 
      var ticker = $.connection.clockHub; 
      function init() { 
      } 
      ticker.client.sendTime = function (h) { 
       $("#timeLabel").html(h); 
      } 
      $.connection.hub.start().done(init); 
     }); 
    </script> 
</body> 
</html> 

Wie hubcontext injizieren in asp.net Kern 2.x Call SignalR Core Hub method from Controller

+0

Es ist nicht kompatibel mit asp.net Kern! GlobalHost.ConnectionManager.GetHubContext .... existiert zur Zeit nicht im SignalR Core. :/ Ich habe eine andere Lösung mit IConnectionManager Instant von GlobalHost gefunden, aber IConnectionManager ist auch nicht im Signalkern-Framework vorhanden. – Hannes

+0

@Hannes Das hast du in deiner Frage nicht geschrieben. Ich habe meine Antwort aktualisiert – Tester