24

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

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

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

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

我考虑过的一种解决方案是在接收到 getValue 后,客户端将调用集线器中的方法,但随后我必须设法将集线器的响应获取到控制器中。

4

4 回答 4

31

从 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 中工作

于 2013-11-02T12:23:12.253 回答
24

SignalR 与其说是一种 RPC 机制,不如说是一种消息传递机制。因此,没有真正的返回值概念。

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

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

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

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

于 2012-12-13T15:44:16.470 回答
6

在服务器上:

    public bool TestBoolRetVal()
    {
        return true;
    }

在 C# 客户端上:

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

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

于 2016-12-26T16:22:47.153 回答
0

要拥有像 infra 这样的 RPC,我们必须通过 SignalR传输来实现它。

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

为此,我们必须完成三件事:

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

如果有人对实现感兴趣,请参阅 Tomasz Pęczek 在 github 中的 repo: 这里

于 2020-05-11T08:11:36.277 回答