以下场景:我有一个运行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;
}
有什么办法可以实现这个目标吗?
答案 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
});