【问题标题】:How to receive broadcast message from Hub class in SignalR client using C#?如何使用 C# 从 SignalR 客户端中的 Hub 类接收广播消息?
【发布时间】:2017-10-25 23:19:04
【问题描述】:

我有一个场景,其中一个客户端正在向 Hub 类方法 AddMessage 发送请求,该方法又应该将该消息广播给所有客户端,包括发起它的客户端。

问题是我可以从客户端调用 Hub 方法AddMessage,如下面的代码所示,但是我找不到在客户端上处理广播消息的方法,该消息在Hub 类使用以下行。

Clients.All.NotifyMessageToClients(name, message);

SignalR 集线器类

using System;
using Microsoft.AspNet.SignalR;
using System.Threading.Tasks;

public class SignalRChatHub : Hub
{
    public void AddMessage(string name, string message)
    {
        // Following call is supposed to notify all clients with passed parameters. 
        // They could have a method called NotifyMessageToClients to fetch the broadcasted message

        Clients.All.NotifyMessageToClients(name, message); 
    }
}

SignalR 客户端

using System;
using Microsoft.AspNet.SignalR.Client;

public partial class Default : System.Web.UI.Page
{
    HubConnection hubConnection;
    IHubProxy stockTickerHubProxy;

    public Default()
    {
        hubConnection = new HubConnection("http://localhost:6898/");
        stockTickerHubProxy = hubConnection.CreateHubProxy("SignalRChatHub");
    }

    async public void SendAddNotification(string msgFrom, string msg)
    {
        // Following line calls Addmessage method in SignalRChatHub class
        await stockTickerHubProxy.Invoke("Addmessage", "Ajendra", "Hello StackOverflow");
    }

    // I might need the method NotifyMessageToClients here... to receive broadcasted message
}

我对如何在 jQuery 中实现相同的功能有了一些想法,但在 C# 中却没有,方法是像上面那样创建一个客户端。我将如何实现这一目标?

如果上述方法在任何方面都没有意义,请向我推荐正确的方法。

【问题讨论】:

  • 我对你写这个问题的方式有点困惑,不太清楚你在这里问什么。您是在问如何向所有客户广播消息吗?因为你已经这样做了。或者您是在问如何在客户端接收它们?或者您可能不知道如何从客户端建立连接?无论如何,请尽量在提问时尽可能明确,也许您可​​以告诉我们您到目前为止所做的尝试。
  • @Dennis1679 很抱歉造成混淆,请查看编辑部分以获得更清晰的信息。希望现在很清楚

标签: signalr signalr-hub signalr.client


【解决方案1】:

你需要像这样监听来自服务器的事件:

public partial class Default : System.Web.UI.Page
{
    HubConnection hubConnection;
    IHubProxy stockTickerHubProxy;

    public Default()
    {
        hubConnection = new HubConnection("http://localhost:6898/");
        stockTickerHubProxy = hubConnection.CreateHubProxy("SignalRChatHub");

        // listen to server events...
        // n is "name" and m is "message", but you can change to "a" and "b" or anything else...
        stockTickerHubProxy.On<string, string>("NotifyMessageToClients", (n, m) =>
        {
            Console.WriteLine("Message received from server. Name: {0} | Message: {1}", n, m);
        });

    }

    // "async" methods should return Task instead of void....
    // unless they are event handlers for UI applications...
    public async Task SendAddNotification(string msgFrom, string msg)
    {
        // first, start the connection...
        await stockTickerHubProxy.Start();
        // Following line calls Addmessage method in SignalRChatHub class
        await stockTickerHubProxy.Invoke("Addmessage", "Ajendra", "Hello StackOverflow");

        // you don't stop the connection, otherwise you won't be able to receive calls from the server
    }

}

...如果您需要更新 WPF 中的 UI,例如,您应该像这样实现您的事件:

stockTickerHubProxy.On<string, string>("NotifyMessageToClients", (a,b) => 
    Dispatcher.InvokeAsync(() =>
        {
            // update UI...
            textBox.Text += string.Format("Name: {0} | Message: {1}", a, b);
        })
);

我建议阅读this guide 了解更详细的信息。

【讨论】:

  • 感谢您的回答。您提到了在 WPF 中更新 UI,有没有办法在使用 Web 应用程序的客户端更新 UI。我会尽快将其标记为答案:)
  • @AjendraPrasad 不客气。在 Web 应用程序中,客户端代码应该是 javascript 以便更新 DOM。据我所知,如果您在服务器端实现客户端,它将无法更新 UI。
  • 感谢您的意见。我现在可以通过点击链接来做到这一点,其中绝对 URL 是 javascript 中指向服务器的引用。 codeguru.com/columns/experts/…
  • @halfer 哦,非常感谢您的分享,我刚刚修复了它。实际上我应该尽快更新它,因为我正在学习 Spark + Kafka + Cassandra。
  • @Alisson:啊,听起来不错。时间太少,玩具太多! Docker 是我的最后一个,Laravel 是当前的,接下来是 React。呼……
猜你喜欢
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2016-12-02
  • 2014-12-15
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多