我正在用 SignalR 组合一个非常基本的“hello world”应用程序,但需要注意的是它是自托管的,这会带来一两个额外的问题。基本上,我试图找出从服务器调用客户端方法的正确方法。
例如,在我的客户端上,我有一个如下所示的方法:
roomHub.onEcho = function (msg) {
console.log("onEcho called: " + msg);
};
我可以像这样从我的服务器端集线器成功调用它:
public class RoomHub : Hub
{
public void Echo(string echo)
{
Clients.onEcho(echo);
}
}
它可以工作,但当然,它会调用所有客户端,而不仅仅是一个。在我在网上看到的各种示例中(例如,https://github.com/SignalR/SignalR/blob/master/samples/Microsoft.AspNet.SignalR.Hosting.AspNet.Samples/Hubs/Benchmark/HubBench.cs,我看到各种各样的命令,看起来我应该能够指定谁被调用,例如:
public void Echo(string echo)
{
Clients.Caller.onEcho(echo);
Clients.Caller(Context.ConnectionId).onEcho(echo);
Clients.All.onEcho(echo);
}
但是我无法使上述任何语法起作用。对于Clients.All.onEcho()
和Clients.Caller.onEcho()
,绝对没有任何反应。对于Clients.Caller(Context.ConnectionId).onEcho()
,Firebug 告诉我它实际上是在尝试调用Caller()
我的 JavaScript roomHub 实例上的一个方法,而这当然不存在。
不过,这有点奇怪。如果我查看 Hub 类,我会明白为什么这些都不起作用 - 因为 Hub 构造函数用 NullClientProxies 覆盖了它的“Clients”对象的一堆属性:
protected Hub()
{
Clients = new HubConnectionContext();
Clients.All = new NullClientProxy();
Clients.Others = new NullClientProxy();
Clients.Caller = new NullClientProxy();
}
但我有点困惑为什么它会这样做 - 或者为什么样本似乎仍然有效 - 或者预期的方法应该是什么。
有什么想法吗?我在这里做错了什么?