【问题标题】:Call SignalR client from Web API Controller从 Web API 控制器调用 SignalR 客户端
【发布时间】:2016-08-08 15:15:12
【问题描述】:

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

有什么方法可以实现吗?

【问题讨论】:

  • 您的实际问题是什么?代码(无论如何是你的抽象)对我来说看起来不错
  • 问题是我需要客户端返回数据才能从web api控制器返回数据。

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


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-08-26
  • 2023-03-19
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多