从 Web API 控制器调用 SignalR 客户端

Call SignalR client from Web API Controller

以下场景:我有一个 ASP.NET Web Api 运行 一个 SignalR 集线器,为 SPA 服务。 SignalR 集线器用于与多个 C# SignalR 客户端通信。 现在我想从特定客户端检索数据,并从 Web API 控制器 return 此数据到 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;
     }

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

不能从服务器中心检索客户端数据。这是 SignalR 缺少的功能。

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

要做到这一点并不容易。这就是我要解决的问题:

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

客户端将 "listen" 执行该命令 (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
});