2016-08-08 106 views
0

Folgendes Szenario: Ich habe eine ASP.NET Web API, die einen SignalR-Hub ausführt und ein SPA bereitstellt. Der SignalR-Hub wird zur Kommunikation mit mehreren C# -SignalR-Clients verwendet. Jetzt möchte ich Daten von einem bestimmten Client abrufen und diese Daten vom Web-API-Controller an den Webclient zurückgeben. Bitte sehen Sie mein Beispiel unten:Call SignalR-Client von Web API Controller

public async Task<IHttpActionResult> Get() 
    { 
     Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<Hubs.ConfigHub>().Clients.Client("SomeConnectionId").getData(); 
     // SignalR client is calling a callback method on the SignalR hub hosted in the web api 
     // return data; 
    } 

Gibt es eine Möglichkeit, wie ich das erreichen kann?

+0

Was ist Ihr eigentliches Problem? Der Code (Ihre Abstraktion, wie auch immer) sieht mir gut aus –

+0

Das Problem ist, dass ich den Client brauche, um Daten zurückzugeben, bevor ich Daten vom Web-API-Controller zurückgebe. –

Antwort

1

Sie kann nicht abrufen Client-Daten vom Server-Hub. Das ist eine SignalR fehlende Funktion.

Der Server kann nur Befehle auf dem Client aufrufen, aber er kann nicht auf eine Antwort warten, daher wird Clients.Client("SomeConnectionId").getData() nichts zurückgeben. Nur Kunden können das tun.

Es gibt keinen einfachen Weg, es zu tun. Dies ist, was würde ich die Situation zu lösen tun:

public async Task<IHttpActionResult> Get() 
{ 
    Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager 
     .GetHubContext<Hubs.ConfigHub>() 
     .Clients.Client("SomeConnectionId") 
     .PleaseSendYourDataToTheHub(); 

    // don´t return anything and don´t await for results on the web client. 
    // The client just needs a 200 (ok) response to be sure the request 
    // is sent and going on. 
} 

Clients für diesen Befehl „hören“ würden (PleaseSendYourDataToTheHub) und dann die entsprechende Methode in der Nabe nennen.

In Ihrem Hub würden Sie eine Methode, wie haben:

public void OnClientData(DataType data) 
{ 
    // TODO find out the web client connection id 
    // send the data to the web client 
    Clients.Client("webClientConnectionId") 
     .DataFromClient(clientId, data); 
} 

Dann werden im Web-Client, Sie zu einem Proxy-Ereignisse hören würden:

proxy.on('DataFromClient', function(clientId, data) { 
    // do something with the data 
}); 
+0

Danke für Ihre hilfreiche Antwort! –