从Web API Controller调用SignalR客户端

时间:2016-08-08 15:15:13

标签: c# asp.net asp.net-web-api controller signalr

以下场景:我有一个运行SignalR集线器的ASP.NET Web Api,为SPA提供服务。 SignalR集线器用于与多个C#SignalR客户端通信。 现在,我想从特定客户端检索数据,并将此数据从Web API Controller返回到Web客户端。请参阅下面的示例:

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

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

1 个答案:

答案 0 :(得分:2)

无法从服务器中心检索客户端数据。这是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
});