2016-08-08 60 views
0

以下情形:我有一个运行SignalR集线器的ASP.NET Web Api,为SPA提供服务。 SignalR集线器用于与多个C#SignalR客户端进行通信。 现在我想从特定的客户端检索数据,并将这些数据从Web API控制器返回给Web客户端。请参阅下面的示例:从Web API控制器呼叫SignalR客户端

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; 
    } 

有什么办法可以实现这个目标吗?

+0

什么实际问题?代码(无论如何,它的抽象)对我来说看起来不错 –

+0

问题是我需要客户端在我从web api控制器返回数据之前返回数据。 –

回答

1

can't从服务器集线器检索客户端数据。这是SignalR缺失的功能。

服务器只能调用客户端的命令,但不能等待任何响应,所以Clients.Client("SomeConnectionId").getData()永远不会返回任何东西。只有客户能够做到这一点。

有没有简单的方法来做到这一点。这是我会做什么,以解决情况:

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. 
} 

客户端将“听”该命令(PleaseSendYourDataToTheHub),然后调用轮毂的相应方法。

在集线器你会喜欢的方法:

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); 
} 

然后,在Web客户端,你会听像一个代理事件:

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

感谢您的帮助! –