从 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
});
以下场景:我有一个 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
});