如何从SignalR消息接收返回值?

时间:2012-12-13 03:20:32

标签: signalr

我从MVC控制器操作中调用SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var ret = context.Clients.Client("Whatever").getValue(userId);

无论如何我可以从动作中的客户端调用getValue()方法获得响应吗?

我尝试了几种方法,但根本无法获得任何ret值。我很确定这不适用于SignalR Hub,但无法找到有关此内容的文档。

我考虑过的一个解决方案是在收到getValue之后,客户端会在Hub中调用一个方法,但后来我不得不破解我从Hub获取响应的方法。

4 个答案:

答案 0 :(得分:30)

从JS调用SignalR服务并且返回值很简单! (对不起,我没有很好地阅读原始问题,可能已经很晚了)。 你可以做得很好:

<script type="text/javascript">
    $(function () {

        $.connection.hub.url = "http://localhost:8080/SignalR";

        // Declare a proxy to reference the hub.
        var myHub = $.connection.myHub;

        // Start the connection.
        $.connection.hub.start().done(function () {

            //Once connected, can call methods with return parameters:
            myHub.server
                .getValue("userId")
                .done(function (result) {
                    $('#resultText').val(result); //display in textbox the return value of a call to public string GetValue(string userId) 
                });
        });
    });
</script>

适用于SignalR 2.0

答案 1 :(得分:20)

SignalR不像消息传递机制那样是RPC机制。因此,没有返回值的真实概念。

如果你想这样做,你就会破解它。您可以简单地做一些事情,在服务器中,您调用getValue()然后客户端的响应是使用返回值调用服务器。

因此,例如,在您的javascript中,您可以使用以下内容:

myHub.client.getValue = function(userId) {
  var retVal;
   ... set your retVal here ...
  myHub.returnValue(userId, retVal)
}

然后让服务器实现returnValue()方法......

答案 2 :(得分:4)

在服务器上:

    public bool TestBoolRetVal()
    {
        return true;
    }

在c#客户端上:

 bool bres = HubProxy.Invoke< bool >("TestBoolRetVal").Result;

当然,您可以定义任何签名。

答案 3 :(得分:0)

要拥有像下面这样的RPC,我们必须在SignalR transport 上实现它。

这涉及将特定的“发送”服务器->客户端消息与另一个方向答案“传入”消息相关联,该消息包含返回值。

要实现这一目标,我们必须完成三件事:

  • 为传出邮件提供唯一的ID,因此传入邮件可以引用该ID。在不同的设计模式中有很多名称,例如 completion token
  • 因为Web服务器将有许多并发客户端,所以同时可能有很多并发客户端,所以我们必须将完成令牌存储在字典中,并将完成任务与每个令牌相关联,实际上,等待只是什么都不做信号
  • 当传入的答案到达服务器时,在其中获取完成令牌,然后查找字典,并发信号通知相关的完成任务并将结果传递给它。

如果对实现感兴趣的人,请参阅github中TomaszPęczek的回购协议: here