获取SignalR服务器的正确语法以调用客户端

时间:2012-11-16 20:57:52

标签: signalr signalr-hub

我正在与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告诉我,它实际上是在我的JavaScript roomHub实例上调用Caller()方法,当然不存在。

但这是奇怪的一点。如果我查看Hub类,我可以看到为什么这些都不起作用 - 因为Hub构造函数使用NullClientProxies覆盖其“Clients”对象的一堆属性:

protected Hub()
{
    Clients = new HubConnectionContext();
    Clients.All = new NullClientProxy();
    Clients.Others = new NullClientProxy();
    Clients.Caller = new NullClientProxy();
}

但我对于为什么会这样做 - 或为什么样本似乎仍然有效 - 或者应该的预期方法有点神秘感。

有什么想法?我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我们最近一直在更新文档,所以你可能已经看到很多不一致的数据。 SignalR的最新版本是1.0 alpha2(http://weblogs.asp.net/davidfowler/archive/2012/11/11/microsoft-asp-net-signalr.aspx)。所有文档都已更新以显示新语法,因此如果您使用的是旧版本,请升级。查看wiki以获取示例https://github.com/SignalR/SignalR/wiki/Hubs