我从MVC控制器操作中调用SignalR
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var ret = context.Clients.Client("Whatever").getValue(userId);
无论如何我可以从动作中的客户端调用getValue()方法获得响应吗?
我尝试了几种方法,但根本无法获得任何ret值。我很确定这不适用于SignalR Hub,但无法找到有关此内容的文档。
我考虑过的一个解决方案是在收到getValue之后,客户端会在Hub中调用一个方法,但后来我不得不破解我从Hub获取响应的方法。
答案 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 上实现它。
这涉及将特定的“发送”服务器->客户端消息与另一个方向答案“传入”消息相关联,该消息包含返回值。
要实现这一目标,我们必须完成三件事:
如果对实现感兴趣的人,请参阅github中TomaszPęczek的回购协议: here