C# 如何在Signal中实现仅限服务器的功能

C# 如何在Signal中实现仅限服务器的功能,c#,signalr,C#,Signalr,我想使用signar将数据推送到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) {

我想使用signar将数据推送到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对象本身的函数(除非这是个坏主意?)

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

信号器是否为此提供了方法(例如,仅服务器功能的属性)

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

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

从Hub继承将向客户端公开其公共方法

我的猜测是,如果您想从服务器方法调用客户机而不从Hub继承类,您可以通过如下方式解析并获得Hub对象:

 public class Notifier
    {
        public static void Say(string message)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
            context.Clients.say(message);
        }
    }
}
公共类通知程序
{
公共静态void Say(字符串消息)
{
var context=GlobalHost.ConnectionManager.GetHubContext();
context.Clients.say(message);
}
}
}

查看集线器上的SignalR wiki:

抱歉,但我不明白,如果“推送”方法仅由服务器使用,为什么要将其创建为公共方法?将此方法设为私有,并仅在服务器端代码中需要时使用。它是公共的,因为我希望服务器上的另一个类调用它。我将更新问题。客户是否需要提供
PushHub
?如果不是,这可能不是问题。如果
PushHub
不是一个客户端类,那么简单地阻止客户端访问它就能解决所有问题。谢谢,我错过了这一点。看来这就是我想要的。我想这有点像我的第一个选择。当我开始工作的时候,我会接受你的答案。太棒了,我正在挖信号机^^