2

我想使用 SignalR 将数据推送到 Web 客户端。

public class PushHub : Hub
{
    public void Push(string data)
    {
        Clients.push(data);
    }
}

public class DataGenerator
{
    private readonly PushHub pushHub;

    public void DataGenerator(PushHub pushHub)
    {
        this.pushHub = pushHub;
    }

    public void Tick()
    {
        pushHub.Push("Ping");
    }
}

但是,我不希望客户端能够调用此函数。

我只是打算从服务器上调用 Hub 对象本身的函数(除非这是一个坏主意?)。

但我不希望客户能够调用推送。

SignalR 是否为此提供了手段(例如,仅服务器功能的属性)?

如果我必须自己实现某些东西,那么我有一些想法,但我不确定它们有多好:

  • 让另一个类访问 Clients 属性,然后调用 Push。
  • 在 HUB 中存储某种只有服务器知道的 Nonce,并将该 nonce 作为额外参数传递给 Push。
  • 从上下文中检查客户端 ID。我想从随机线程调用函数时它不存在。
4

1 回答 1

11

从 Hub 继承会将其公共方法公开给客户端。

我的猜测是,如果您想从服务器方法调用客户端而不从 Hub 继承类,您可以通过解析和获取 hub 对象来实现,如下所示:

 public class Notifier
    {
        public static void Say(string message)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
            context.Clients.say(message);
        }
    }
}

请参阅集线器上的 SignalR wiki:https ://github.com/SignalR/SignalR/wiki/Hubs

于 2012-08-29T13:45:41.143 回答