如何从C#中的SignalR集线器向客户端推送数据

时间:2019-04-19 11:01:52

标签: c# stream signalr

我正在使用MS示例中的代码:

        public Task PushMessage(string Message)
        {
            var T = Clients.All.SendAsync(Message);
            Console.WriteLine("I'm here");
            return T;
        }

,但从未达到writeline调用。那么在推送消息之前,我是否需要检查至少一个客户端已连接?

我要实现的目标如下:我产生了许多小消息,需要将这些小消息推送到连接到集线器的客户端(如果有)。 因此无论客户端如何连接,都将产生消息。

现在,我已经在构建新数据时生成的事件中添加了一个SendMessage调用,但这会导致保留回调,因为SendMessage不返回。

我要寻找的行为是:如果有客户,他们会收到消息,如果没有客户,则消息将被丢弃。

我该如何实现?

我想我可能会误解SignalR的工作方式,我真的想找到一个示例C#<-> C#,因为网络上的每个示例都是以web / js为中心的。

1 个答案:

答案 0 :(得分:0)

GitHub中为控制台应用程序遍历一些示例代码。

SignalR仅在有要广播的连接时广播。这就是这一点的一部分,因此您不必管理这一方面。您当然可以轮询或随意获取数据,但是当您告诉它发送SignalR时,它将检查是否有任何人可以将其发送到。

对于C#到C#还是C#到Web / js,是的,您正在考虑这个错误。如果是控制台应用程序或Web / js,则为客户端。通信是客户端到服务器以及服务器(集线器)到客户端。无论是控制台应用程序还是Web / js或任何其他类型的客户端,都没有关系。

这是我用于演示目的的控制台应用程序的一个示例,它使我可以在控制台与通过集线器进行控制台的网页或网页之间来回聊天:

        private static void Main(string[] args)
    {
        try
        {

            var connection = new HubConnection("http://localhost:7132/");
            IHubProxy hub = connection.CreateHubProxy("ChatHub");

            hub.On<string, string>("broadcastMessage", (name, message) => { Console.Write(name + ": "); Console.WriteLine(message); });
            connection.Start().Wait();
            hub.Invoke("Notify", "Console app", connection.ConnectionId);
            string msg = null;

            while ((msg = Console.ReadLine()) != null)
            {
                hub.Invoke("Send", "Console app", msg).Wait();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine("Error" + e.Message);
        }

    }