【问题标题】:Getting the right syntax for SignalR server to call client获取 SignalR 服务器调用客户端的正确语法
【发布时间】:2012-11-17 16:38:55
【问题描述】:

我正在使用 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();
}

但我有点困惑为什么它会这样做 - 或者为什么样本似乎仍然有效 - 或者预期的方法应该是什么。

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

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案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

    【讨论】:

    • 谢谢,大卫。我在 NuGet 上没有看到的一件事是自托管库。我错过了那些吗?还是我只需要自己构建它们?
    • 自托管正在为 1.0 后的版本进行改造。我们以 OWIN 为基础,不会改进当前的。不过,您始终可以从源代码构建它(这就是我们将其留在那里的原因)。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多